public override string Type(SequenceCheckingEnvironment env) { if (DestVar.Type == "") { return(""); } GrGenType nodeOrEdgeType = TypesHelper.GetNodeOrEdgeType(DestVar.Type, env.Model); AttributeType attributeType = nodeOrEdgeType.GetAttributeType(AttributeName); if (attributeType == null) { return(""); // error, will be reported by Check, just ensure we don't crash here } string ContainerType = TypesHelper.AttributeTypeToXgrsType(attributeType); if (DestVar.Type.StartsWith("map")) { return(TypesHelper.ExtractDst(DestVar.Type) ?? ""); } else { return(TypesHelper.ExtractSrc(DestVar.Type) ?? ""); } }
public override string TypeOfMemberOrAttribute(string matchOrGraphElementType, string memberOrAttribute) { if (matchOrGraphElementType.StartsWith("match<class ")) { String matchClassName = TypesHelper.GetMatchClassName(matchOrGraphElementType); IMatchClass matchClass = actionsTypeInformation.matchClasses[matchClassName]; IPatternElement element = matchClass.GetPatternElement(memberOrAttribute); if (element == null) { throw new SequenceParserException(memberOrAttribute, SequenceParserError.UnknownMatchMember); } GrGenType elementType = element.Type; return(TypesHelper.DotNetTypeToXgrsType(elementType)); } else if (matchOrGraphElementType.StartsWith("match<")) { String ruleName = TypesHelper.GetRuleName(matchOrGraphElementType); if (!actionsTypeInformation.rulesToTopLevelEntities[ruleName].Contains(memberOrAttribute)) { throw new SequenceParserException(memberOrAttribute, SequenceParserError.UnknownMatchMember); } int indexOfEntity = actionsTypeInformation.rulesToTopLevelEntities[ruleName].IndexOf(memberOrAttribute); return(actionsTypeInformation.rulesToTopLevelEntityTypes[ruleName][indexOfEntity]); } else { GrGenType graphElementType = TypesHelper.GetNodeOrEdgeType(matchOrGraphElementType, Model); AttributeType attributeType = graphElementType.GetAttributeType(memberOrAttribute); if (attributeType == null) { throw new SequenceParserException(memberOrAttribute, SequenceParserError.UnknownAttribute); } return(TypesHelper.AttributeTypeToXgrsType(attributeType)); } }
public override string TypeOfMemberOrAttribute(string matchOrGraphElementType, string memberOrAttribute) { if (matchOrGraphElementType.StartsWith("match<class ")) { MatchClassFilterer matchClass = actions.GetMatchClass(TypesHelper.GetMatchClassName(matchOrGraphElementType)); IPatternElement element = matchClass.info.GetPatternElement(memberOrAttribute); if (element == null) { throw new SequenceParserException(memberOrAttribute, SequenceParserError.UnknownMatchMember); } GrGenType elementType = element.Type; return(TypesHelper.DotNetTypeToXgrsType(elementType)); } else if (matchOrGraphElementType.StartsWith("match<")) { IAction action = actions.GetAction(TypesHelper.GetRuleName(matchOrGraphElementType)); IPatternElement element = action.RulePattern.PatternGraph.GetPatternElement(memberOrAttribute); if (element == null) { throw new SequenceParserException(memberOrAttribute, SequenceParserError.UnknownMatchMember); } GrGenType elementType = element.Type; return(TypesHelper.DotNetTypeToXgrsType(elementType)); } else { GrGenType graphElementType = TypesHelper.GetNodeOrEdgeType(matchOrGraphElementType, Model); AttributeType attributeType = graphElementType.GetAttributeType(memberOrAttribute); if (attributeType == null) { throw new SequenceParserException(memberOrAttribute, SequenceParserError.UnknownAttribute); } return(TypesHelper.AttributeTypeToXgrsType(attributeType)); } }
/// <summary> /// Helper for checking function method calls. /// Checks whether called entity exists, and type checks the input. /// Throws an exception when an error is found. /// </summary> /// <param name="seqExprFuncMethodCall">The function method call to check</param> /// <param name="targetExpr">The target of the procedure function call</param> public void CheckFunctionMethodCall(SequenceExpression targetExpr, SequenceExpressionFunctionMethodCall seqExprFuncMethodCall) { String targetExprType = targetExpr.Type(this); if (targetExprType == "") { // only runtime checks possible (we could check whether the called procedure signature exists in at least one of the model types, if not it's a type error, can't work at runtime, but that kind of negative check is not worth the effort) return; } GrGenType ownerType = TypesHelper.GetNodeOrEdgeType(targetExprType, Model); if (ownerType == null) { // error, must be node or edge type throw new SequenceParserException(targetExprType, SequenceParserError.UserMethodsOnlyAvailableForGraphElements); } // check whether called function method exists if (ownerType.GetFunctionMethod(seqExprFuncMethodCall.Name) == null) { throw new SequenceParserException(seqExprFuncMethodCall, -1, SequenceParserError.UnknownProcedure); } CheckFunctionCallBase(seqExprFuncMethodCall, ownerType); }
public override string Type(SequenceCheckingEnvironment env) { if(DestVar.Type == "") return ""; GrGenType nodeOrEdgeType = TypesHelper.GetNodeOrEdgeType(DestVar.Type, env.Model); AttributeType attributeType = nodeOrEdgeType.GetAttributeType(AttributeName); return TypesHelper.AttributeTypeToXgrsType(attributeType); }
public override void Check(SequenceCheckingEnvironment env) { base.Check(env); GrGenType nodeOrEdgeType = TypesHelper.GetNodeOrEdgeType(GraphElementVar.Type, env.Model); if(GraphElementVar.Type != "" && nodeOrEdgeType == null) throw new SequenceParserException(Symbol, "node or edge type", GraphElementVar.Type); if(!TypesHelper.IsSameOrSubtype(VisitedFlagExpression.Type(env), "int", env.Model)) throw new SequenceParserException(Symbol, "int", VisitedFlagExpression.Type(env)); }
public override void Check(SequenceCheckingEnvironment env) { base.Check(env); if(DestVar.Type == "") return; // we can't gain access to an attribute type if the variable is untyped, only runtime-check possible GrGenType nodeOrEdgeType = TypesHelper.GetNodeOrEdgeType(DestVar.Type, env.Model); if(nodeOrEdgeType == null) throw new SequenceParserException(Symbol, "node or edge type", DestVar.Type); AttributeType attributeType = nodeOrEdgeType.GetAttributeType(AttributeName); if(attributeType == null) throw new SequenceParserException(AttributeName, SequenceParserError.UnknownAttribute); }
public override void Check(SequenceCheckingEnvironment env) { base.Check(env); if (DestVar.Type == "") { return; // we can't gain access to an attribute type if the variable is untyped, only runtime-check possible } GrGenType nodeOrEdgeType = TypesHelper.GetNodeOrEdgeType(DestVar.Type, env.Model); if (nodeOrEdgeType == null) { throw new SequenceParserException(Symbol, "node or edge type", DestVar.Type); } AttributeType attributeType = nodeOrEdgeType.GetAttributeType(AttributeName); if (attributeType == null) { throw new SequenceParserException(AttributeName, SequenceParserError.UnknownAttribute); } string ContainerType = TypesHelper.AttributeTypeToXgrsType(attributeType); if (TypesHelper.ExtractSrc(ContainerType) == null || TypesHelper.ExtractDst(ContainerType) == null || TypesHelper.ExtractDst(ContainerType) == "SetValueType") { throw new SequenceParserException(Symbol, "map<S,T> or array<T> or deque<T>", DestVar.Type); } if (ContainerType.StartsWith("array")) { if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), "int", env.Model)) { throw new SequenceParserException(Symbol, "int", KeyExpression.Type(env)); } } else if (ContainerType.StartsWith("deque")) { if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), "int", env.Model)) { throw new SequenceParserException(Symbol, "int", KeyExpression.Type(env)); } } else { if (!TypesHelper.IsSameOrSubtype(KeyExpression.Type(env), TypesHelper.ExtractSrc(ContainerType), env.Model)) { throw new SequenceParserException(Symbol, TypesHelper.ExtractSrc(ContainerType), KeyExpression.Type(env)); } } }
public static IList Extract(object container, string memberOrAttribute, IGraphProcessingEnvironment procEnv) { IList array = (IList)container; string arrayType = TypesHelper.DotNetTypeToXgrsType(array.GetType()); string arrayValueType = TypesHelper.ExtractSrc(arrayType); if (arrayValueType.StartsWith("match<")) { if (arrayValueType == "match<>") { if (array.Count > 0) { IMatch match = (IMatch)array[0]; object matchElement = match.GetMember(memberOrAttribute); Type matchElementType; if (matchElement is IGraphElement) { matchElementType = TypesHelper.GetType(((IGraphElement)matchElement).Type, procEnv.Graph.Model); } else { matchElementType = matchElement.GetType(); } Type listType = typeof(List <>).MakeGenericType(matchElementType); IList extractedArray = (IList)Activator.CreateInstance(listType); ExtractMatchMember(array, memberOrAttribute, extractedArray); return(extractedArray); } else { return(new List <object>()); } } else { if (arrayValueType.StartsWith("match<class ")) { MatchClassFilterer matchClass = procEnv.Actions.GetMatchClass(TypesHelper.GetMatchClassName(arrayValueType)); IPatternElement element = matchClass.info.GetPatternElement(memberOrAttribute); GrGenType elementType = element.Type; Type listType = typeof(List <>).MakeGenericType(TypesHelper.GetType(elementType, procEnv.Graph.Model)); IList extractedArray = (IList)Activator.CreateInstance(listType); ExtractMatchMember(array, memberOrAttribute, extractedArray); return(extractedArray); } else { IAction action = procEnv.Actions.GetAction(TypesHelper.GetRuleName(arrayValueType)); IPatternElement element = action.RulePattern.PatternGraph.GetPatternElement(memberOrAttribute); GrGenType elementType = element.Type; Type listType = typeof(List <>).MakeGenericType(TypesHelper.GetType(elementType, procEnv.Graph.Model)); IList extractedArray = (IList)Activator.CreateInstance(listType); ExtractMatchMember(array, memberOrAttribute, extractedArray); return(extractedArray); } } } else { GrGenType graphElementType = TypesHelper.GetNodeOrEdgeType(arrayValueType, procEnv.Graph.Model); if (graphElementType != null) { AttributeType attributeType = graphElementType.GetAttributeType(memberOrAttribute); Type listType = typeof(List <>).MakeGenericType(attributeType.Type); IList extractedArray = (IList)Activator.CreateInstance(listType); ExtractAttribute(array, memberOrAttribute, extractedArray); return(extractedArray); } else { if (array.Count > 0) { IGraphElement graphElement = (IGraphElement)array[0]; object element = graphElement.GetAttribute(memberOrAttribute); Type elementType; if (element is IGraphElement) { elementType = TypesHelper.GetType(((IGraphElement)element).Type, procEnv.Graph.Model); } else { elementType = element.GetType(); } Type listType = typeof(List <>).MakeGenericType(elementType); IList extractedArray = (IList)Activator.CreateInstance(listType); ExtractAttribute(array, memberOrAttribute, extractedArray); return(extractedArray); } else { return(new List <object>()); } } } }