/// <summary> /// Inserts code to build the match object /// at the given position, returns position after inserted operations /// </summary> private SearchProgramOperation insertMatchObjectBuilding( SearchProgramOperation insertionPoint, PatternGraph patternGraph, MatchObjectType matchObjectType, bool defElements) { String matchObjectName; if(matchObjectType==MatchObjectType.Independent) { matchObjectName = NamesOfEntities.MatchedIndependentVariable(patternGraph.pathPrefix + patternGraph.name); } else if(matchObjectType==MatchObjectType.Patternpath) { matchObjectName = NamesOfEntities.PatternpathMatch(patternGraph.pathPrefix + patternGraph.name); } else { //if(matchObjectType==MatchObjectType.Normal) matchObjectName = "match"; } String enumPrefix = patternGraph.pathPrefix + patternGraph.name + "_"; for (int i = 0; i < patternGraph.nodesPlusInlined.Length; ++i) { // in defElements pass only def elements, in non defElements pass only non def elements if(defElements == patternGraph.nodesPlusInlined[i].defToBeYieldedTo) { string inlinedMatchObjectName = null; string unprefixedName = patternGraph.nodesPlusInlined[i].UnprefixedName; if(patternGraph.nodesPlusInlined[i].originalNode != null) { if(patternGraph.WasInlinedHere(patternGraph.nodesPlusInlined[i].originalSubpatternEmbedding)) inlinedMatchObjectName = "match_" + patternGraph.nodesPlusInlined[i].originalSubpatternEmbedding.Name; unprefixedName = patternGraph.nodesPlusInlined[i].originalElement.UnprefixedName; } BuildMatchObject buildMatch = new BuildMatchObject( BuildMatchObjectType.Node, patternGraph.nodesPlusInlined[i].typeName, unprefixedName, patternGraph.nodesPlusInlined[i].Name, rulePatternClassName, enumPrefix, inlinedMatchObjectName ?? matchObjectName, -1 ); insertionPoint = insertionPoint.Append(buildMatch); } } for (int i = 0; i < patternGraph.edgesPlusInlined.Length; ++i) { // in defElements pass only def elements, in non defElements pass only non def elements if(defElements == patternGraph.edgesPlusInlined[i].defToBeYieldedTo) { string inlinedMatchObjectName = null; string unprefixedName = patternGraph.edgesPlusInlined[i].UnprefixedName; if(patternGraph.edgesPlusInlined[i].originalEdge != null) { if(patternGraph.WasInlinedHere(patternGraph.edgesPlusInlined[i].originalSubpatternEmbedding)) inlinedMatchObjectName = "match_" + patternGraph.edgesPlusInlined[i].originalSubpatternEmbedding.Name; unprefixedName = patternGraph.edgesPlusInlined[i].originalElement.UnprefixedName; } BuildMatchObject buildMatch = new BuildMatchObject( BuildMatchObjectType.Edge, patternGraph.edgesPlusInlined[i].typeName, unprefixedName, patternGraph.edgesPlusInlined[i].Name, rulePatternClassName, enumPrefix, inlinedMatchObjectName ?? matchObjectName, -1 ); insertionPoint = insertionPoint.Append(buildMatch); } } // only nodes and edges for patternpath matches if (matchObjectType == MatchObjectType.Patternpath) { return insertionPoint; } foreach (PatternVariable var in patternGraph.variablesPlusInlined) { // in defElements pass only def elements, in non defElements pass only non def elements if(defElements == var.defToBeYieldedTo) { string inlinedMatchObjectName = null; string unprefixedName = var.UnprefixedName; if(var.originalVariable != null) { if(patternGraph.WasInlinedHere(var.originalSubpatternEmbedding)) inlinedMatchObjectName = "match_" + var.originalSubpatternEmbedding.Name; unprefixedName = var.originalVariable.UnprefixedName; } BuildMatchObject buildMatch = new BuildMatchObject( BuildMatchObjectType.Variable, TypesHelper.TypeName(var.type), unprefixedName, var.Name, rulePatternClassName, enumPrefix, inlinedMatchObjectName ?? matchObjectName, -1 ); insertionPoint = insertionPoint.Append(buildMatch); } } // only nodes, edges, variables in defElements pass if(defElements) { return insertionPoint; } for (int i = 0; i < patternGraph.embeddedGraphsPlusInlined.Length; ++i) { if(patternGraph.embeddedGraphsPlusInlined[i].inlined) { BuildMatchObject buildMatch = new BuildMatchObject( BuildMatchObjectType.InlinedSubpattern, "", patternGraph.embeddedGraphsPlusInlined[i].name, patternGraph.embeddedGraphsPlusInlined[i].name, "", "", matchObjectName, -1 ); insertionPoint = insertionPoint.Append(buildMatch); } else { string inlinedMatchObjectName = null; string unprefixedName = patternGraph.embeddedGraphsPlusInlined[i].name; if(patternGraph.embeddedGraphsPlusInlined[i].originalEmbedding != null) { if(patternGraph.WasInlinedHere(patternGraph.embeddedGraphsPlusInlined[i].originalSubpatternEmbedding)) inlinedMatchObjectName = "match_" + patternGraph.embeddedGraphsPlusInlined[i].originalSubpatternEmbedding.Name; unprefixedName = patternGraph.embeddedGraphsPlusInlined[i].originalEmbedding.name; } string subpatternContainingType = NamesOfEntities.RulePatternClassName(patternGraph.embeddedGraphsPlusInlined[i].EmbeddedGraph.Name, patternGraph.embeddedGraphsPlusInlined[i].EmbeddedGraph.Package, true); string subpatternType = NamesOfEntities.MatchClassName(patternGraph.embeddedGraphsPlusInlined[i].EmbeddedGraph.Name); BuildMatchObject buildMatch = new BuildMatchObject( BuildMatchObjectType.Subpattern, subpatternContainingType + "." + subpatternType, unprefixedName, patternGraph.embeddedGraphsPlusInlined[i].name, rulePatternClassName, enumPrefix, inlinedMatchObjectName ?? matchObjectName, -1 ); insertionPoint = insertionPoint.Append(buildMatch); } } for (int i = 0; i < patternGraph.iteratedsPlusInlined.Length; ++i) { string inlinedMatchObjectName = null; string unprefixedName = patternGraph.iteratedsPlusInlined[i].iteratedPattern.name; string inlinedPatternClassName = rulePatternClassName; string patternElementType = patternGraph.pathPrefix + patternGraph.name + "_" + patternGraph.iteratedsPlusInlined[i].iteratedPattern.name; if(patternGraph.iteratedsPlusInlined[i].originalIterated != null) { if(patternGraph.WasInlinedHere(patternGraph.iteratedsPlusInlined[i].originalSubpatternEmbedding)) inlinedMatchObjectName = "match_" + patternGraph.iteratedsPlusInlined[i].originalSubpatternEmbedding.Name; unprefixedName = patternGraph.iteratedsPlusInlined[i].originalIterated.iteratedPattern.Name; inlinedPatternClassName = patternGraph.iteratedsPlusInlined[i].originalSubpatternEmbedding.matchingPatternOfEmbeddedGraph.GetType().Name; patternElementType = patternGraph.iteratedsPlusInlined[i].originalIterated.iteratedPattern.pathPrefix + unprefixedName; } BuildMatchObject buildMatch = new BuildMatchObject( BuildMatchObjectType.Iteration, patternElementType, unprefixedName, patternGraph.iteratedsPlusInlined[i].iteratedPattern.name, inlinedPatternClassName, enumPrefix, inlinedMatchObjectName ?? matchObjectName, patternGraph.embeddedGraphsPlusInlined.Length ); insertionPoint = insertionPoint.Append(buildMatch); } for (int i = 0; i < patternGraph.alternativesPlusInlined.Length; ++i) { string inlinedMatchObjectName = null; string unprefixedName = patternGraph.alternativesPlusInlined[i].name; string inlinedPatternClassName = rulePatternClassName; string patternElementType = patternGraph.pathPrefix+patternGraph.name+"_"+patternGraph.alternativesPlusInlined[i].name; if(patternGraph.alternativesPlusInlined[i].originalAlternative != null) { if(patternGraph.WasInlinedHere(patternGraph.alternativesPlusInlined[i].originalSubpatternEmbedding)) inlinedMatchObjectName = "match_" + patternGraph.alternativesPlusInlined[i].originalSubpatternEmbedding.Name; unprefixedName = patternGraph.alternativesPlusInlined[i].originalAlternative.name; inlinedPatternClassName = patternGraph.alternativesPlusInlined[i].originalSubpatternEmbedding.matchingPatternOfEmbeddedGraph.GetType().Name; patternElementType = patternGraph.alternativesPlusInlined[i].originalAlternative.pathPrefix + unprefixedName; } BuildMatchObject buildMatch = new BuildMatchObject( BuildMatchObjectType.Alternative, patternElementType, unprefixedName, patternGraph.alternativesPlusInlined[i].name, inlinedPatternClassName, enumPrefix, inlinedMatchObjectName ?? matchObjectName, patternGraph.embeddedGraphsPlusInlined.Length ); insertionPoint = insertionPoint.Append(buildMatch); } if (patternGraph.nestedIndependents != null) { foreach (KeyValuePair<PatternGraph,PatternGraph> nestedIndependent in patternGraph.nestedIndependents) { string inlinedMatchObjectName = null; string unprefixedName = nestedIndependent.Key.name; string inlinedPatternClassName = rulePatternClassName; string matchClassName = nestedIndependent.Key.pathPrefix + nestedIndependent.Key.name; if(nestedIndependent.Key.originalPatternGraph != null) { if(patternGraph.WasInlinedHere(nestedIndependent.Key.originalSubpatternEmbedding)) inlinedMatchObjectName = "match_" + nestedIndependent.Key.originalSubpatternEmbedding.Name; unprefixedName = nestedIndependent.Key.originalPatternGraph.Name; inlinedPatternClassName = nestedIndependent.Key.originalSubpatternEmbedding.matchingPatternOfEmbeddedGraph.GetType().Name; matchClassName = nestedIndependent.Key.pathPrefix + unprefixedName; } BuildMatchObject buildMatch = new BuildMatchObject( BuildMatchObjectType.Independent, unprefixedName, nestedIndependent.Key.pathPrefix + nestedIndependent.Key.name, inlinedPatternClassName, inlinedMatchObjectName ?? matchObjectName, matchClassName ); insertionPoint = insertionPoint.Append(buildMatch); } } // we only have to take care of yielding in case of normal and independent matches // and if we contain a def entity (and if we are not in the defElements pass), or if we contain a ref entity (that may be yielded to instead) if(matchObjectType != MatchObjectType.Patternpath && (patternGraph.isDefEntityExistingPlusInlined || patternGraph.IsRefEntityExisting())) { // first compute the yieldings which were inlined from subpatterns to us insertionPoint = insertYields(insertionPoint, patternGraph, matchObjectName, true); // then the yieldings of the current pattern return insertYields(insertionPoint, patternGraph, matchObjectName, false); // in the def-elements pass the yieldings computed into local variables are written to the match } return insertionPoint; }
/// <summary> /// Inserts code to create the match objects of the inlined subpatterns /// at the given position, returns position after inserted operations /// </summary> private SearchProgramOperation insertInlinedMatchObjectCreation( SearchProgramOperation insertionPoint, PatternGraph patternGraph, MatchObjectType matchObjectType) { String matchOfEnclosingPatternName; if(matchObjectType == MatchObjectType.Independent) { matchOfEnclosingPatternName = NamesOfEntities.MatchedIndependentVariable(patternGraph.pathPrefix + patternGraph.name); } else { //if(matchObjectType==MatchObjectType.Normal) matchOfEnclosingPatternName = "match"; } for(int i = 0; i < patternGraph.embeddedGraphsPlusInlined.Length; ++i) { if(patternGraph.embeddedGraphsPlusInlined[i].inlined) { LGSPMatchingPattern matchingPattern = patternGraph.embeddedGraphsPlusInlined[i].matchingPatternOfEmbeddedGraph; string inlinedPatternClassName = NamesOfEntities.RulePatternClassName(matchingPattern.name, matchingPattern.PatternGraph.Package, true); insertionPoint = insertionPoint.Append( new CreateInlinedSubpatternMatch( inlinedPatternClassName, matchingPattern.patternGraph.pathPrefix + matchingPattern.patternGraph.name, patternGraph.embeddedGraphsPlusInlined[i].Name, matchOfEnclosingPatternName) ); } } return insertionPoint; }