blob: afedd587e27a953631aece24a5009765a4c58ea1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004-2008 Akos Horvath, Gergely Varro and Daniel Varro
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Akos Horvath, Gergely Varro - initial API and implementation
*******************************************************************************/
package org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.operation;
import java.util.Set;
import org.eclipse.viatra2.gtasm.patternmatcher.exceptions.PatternMatcherRuntimeException;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.MatchingFrame;
import org.eclipse.viatra2.gtasm.patternmatcher.impl.patternmatcher.internal.callgraph.PatternNode;
import org.eclipse.viatra2.gtasmmodel.gtasm.metamodel.asm.core.AnnotatedElement;
/**
* Represents a pattern call operation in a recursive pattern
* variant. Such operation is contained by only non-recursive
* FlattenedPatterns.
*/
public class PatternCallOperation extends SearchPlanOperation {
private PatternNode calledPattern = null;
private Integer[] callFormalToActualMapping = null;
private Boolean[] adornment = null;
public PatternCallOperation(PatternNode calledPattern,
Integer[] parameterMapping,
Boolean[] boundParameters) {
assert parameterMapping.length == boundParameters.length;
this.calledPattern = calledPattern;
this.callFormalToActualMapping = parameterMapping;
this.adornment = boundParameters;
}
public void calculateSidewaysPassedVariables(Set<Integer> variableSet) {
for (int i = 0; i < callFormalToActualMapping.length; i++) {
variableSet.add(callFormalToActualMapping[i]);
if (!adornment[i]) {
variableSet.remove(callFormalToActualMapping[i]);
}
}
}
public void calculateLocalVariables(Set<Integer> variableSet) {
for (int i = 0; i < callFormalToActualMapping.length; i++) {
variableSet.add(callFormalToActualMapping[i]);
}
}
public PatternNode getPatternNode() {
return calledPattern;
}
public Boolean[] getAdornment() {
return adornment;
}
public Integer[] getParameterMapping() {
return callFormalToActualMapping;
}
public String toString(){
StringBuffer b = new StringBuffer();
b.append(getClass().getSimpleName());
b.append(" : ");
b.append(calledPattern.getPattern().getName());
b.append("^");
StringBuffer params = new StringBuffer();
assert adornment.length == callFormalToActualMapping.length;
for (int i = 0; i < adornment.length; i++) {
b.append((adornment[i] ? 'b' : 'f'));
params.append(callFormalToActualMapping[i]);
}
b.append("(");
b.append(params);
b.append(")");
return b.toString();
}
@Override
public boolean execute(MatchingFrame frame) throws PatternMatcherRuntimeException {
return false;
}
@Override
public void postprocess(MatchingFrame frame) throws PatternMatcherRuntimeException {
}
@Override
public void preprocess(MatchingFrame frame) throws PatternMatcherRuntimeException {
}
public AnnotatedElement getErrorfulElement(MatchingFrame frame) {
return null;
}
}