Skip to content

Commit

Permalink
Spoofax/840
Browse files Browse the repository at this point in the history
  • Loading branch information
oskar-van-rest committed Apr 1, 2014
1 parent dcebffb commit eea1a34
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 85 deletions.
Expand Up @@ -10,7 +10,6 @@
import org.strategoxt.imp.runtime.parser.SGLRParseController;
import org.strategoxt.imp.runtime.services.StrategoObserver;
import org.strategoxt.imp.runtime.stratego.StrategoTermPath;
import org.strategoxt.lang.Context;

public class SelectionUtil {

Expand Down Expand Up @@ -44,12 +43,11 @@ public static IStrategoTerm getSelectionAstAnalyzed(int offset, int length, bool
if (selectionAst != null) {
try {
StrategoObserver observer = editorState.getDescriptor().createService(StrategoObserver.class, editorState.getParseController());
Context context = observer.getRuntime().getCompiledContext();
IStrategoTerm analyzedAst = editorState.getCurrentAnalyzedAst() == null? editorState.getAnalyzedAst() : editorState.getCurrentAnalyzedAst();

IStrategoList path = StrategoTermPath.getTermPathWithOrigin(context, analyzedAst, selectionAst);
IStrategoList path = StrategoTermPath.getTermPathWithOrigin(observer, analyzedAst, selectionAst);
if (path != null) {
return StrategoTermPath.getTermAtPath(context, editorState.getCurrentAnalyzedAst(), path);
return StrategoTermPath.getTermAtPath(observer, editorState.getCurrentAnalyzedAst(), path);
}
} catch (BadDescriptorException e) {
e.printStackTrace();
Expand Down
Expand Up @@ -31,7 +31,6 @@
import org.strategoxt.imp.runtime.stratego.EditorIOAgent;
import org.strategoxt.imp.runtime.stratego.SourceAttachment;
import org.strategoxt.imp.runtime.stratego.StrategoTermPath;
import org.strategoxt.lang.Context;
import org.strategoxt.stratego_aterm.implode_aterm_0_0;
import org.strategoxt.stratego_aterm.stratego_aterm;

Expand All @@ -45,26 +44,26 @@ public class InputTermBuilder {
private static final Map<IResource, IStrategoTerm> EMPTY_MAP =
Collections.emptyMap();

private HybridInterpreter runtime;
private StrategoObserver observer;

private final Map<IResource, IStrategoTerm> resultingAsts;

private final IStrategoTerm resultingAst;

public InputTermBuilder(HybridInterpreter runtime, Map<IResource, IStrategoTerm> resultingAsts) {
this.runtime = runtime;
public InputTermBuilder(StrategoObserver observer, Map<IResource, IStrategoTerm> resultingAsts) {
this.observer = observer;
this.resultingAsts = resultingAsts;
this.resultingAst = null;
}

public InputTermBuilder(HybridInterpreter runtime, IStrategoTerm resultingAst) {
this.runtime = runtime;
public InputTermBuilder(StrategoObserver observer, IStrategoTerm resultingAst) {
this.observer = observer;
this.resultingAsts = EMPTY_MAP;
this.resultingAst = resultingAst;
}

public HybridInterpreter getRuntime() {
return runtime;
return observer.getRuntime();
}

/**
Expand Down Expand Up @@ -96,11 +95,10 @@ public IStrategoTuple makeInputTermResultingAst(IStrategoTerm node, boolean incl

public IStrategoTuple makeInputTermResultingAst(IStrategoTerm resultingAst,
IStrategoTerm node, boolean includeSubNode) {
Context context = runtime.getCompiledContext();
IStrategoList termPath = StrategoTermPath.getTermPathWithOrigin(context, resultingAst, node);
IStrategoList termPath = StrategoTermPath.getTermPathWithOrigin(observer, resultingAst, node);
if (termPath == null)
return makeInputTermSourceAst(node, includeSubNode);
IStrategoTerm targetTerm = StrategoTermPath.getTermAtPath(context, resultingAst, termPath);
IStrategoTerm targetTerm = StrategoTermPath.getTermAtPath(observer, resultingAst, termPath);
if(node instanceof StrategoSubList){
if(!(targetTerm instanceof IStrategoList))
return makeInputTermSourceAst(node, includeSubNode);
Expand All @@ -121,11 +119,10 @@ private IStrategoTerm mkSubListTarget(IStrategoTerm resultingAst, IStrategoList
}

private IStrategoTerm getResultingTerm(IStrategoTerm resultingAst, IStrategoTerm originTerm) {
Context context = runtime.getCompiledContext();
IStrategoList pathFirstChild = StrategoTermPath.getTermPathWithOrigin(context, resultingAst, originTerm);
IStrategoList pathFirstChild = StrategoTermPath.getTermPathWithOrigin(observer, resultingAst, originTerm);
IStrategoTerm firstChild = null;
if(pathFirstChild != null)
firstChild = StrategoTermPath.getTermAtPath(context, resultingAst, pathFirstChild);
firstChild = StrategoTermPath.getTermAtPath(observer, resultingAst, pathFirstChild);
return firstChild;
}

Expand Down Expand Up @@ -202,7 +199,7 @@ protected String tryGetProjectPath(IResource resource) {
* based on the IStrategoTerm syntax of the AST of the source file.
*/
public IStrategoTuple makeATermInputTerm(IStrategoTerm node, boolean includeSubNode, IResource resource) {
stratego_aterm.init(runtime.getCompiledContext());
stratego_aterm.init(observer.getRuntime().getCompiledContext());

ITermFactory factory = Environment.getTermFactory();
String path = resource.getProjectRelativePath().toPortableString();
Expand All @@ -212,7 +209,7 @@ public IStrategoTuple makeATermInputTerm(IStrategoTerm node, boolean includeSubN
node = getImplodableNode(node);
IStrategoTerm[] inputParts = {
implodeATerm(node),
StrategoTermPath.createPathFromParsedIStrategoTerm(node, runtime.getCompiledContext()),
StrategoTermPath.createPathFromParsedIStrategoTerm(node, observer),
implodeATerm(getRoot(node)),
factory.makeString(path),
factory.makeString(absolutePath)
Expand All @@ -224,7 +221,13 @@ public IStrategoTuple makeATermInputTerm(IStrategoTerm node, boolean includeSubN
}

public IStrategoTerm implodeATerm(IStrategoTerm term) {
return implode_aterm_0_0.instance.invoke(runtime.getCompiledContext(), term);
observer.getLock().lock();
try {
return implode_aterm_0_0.instance.invoke(observer.getRuntime().getCompiledContext(), term);
}
finally {
observer.getLock().unlock();
}
}

public IStrategoTerm getImplodableNode(IStrategoTerm node) {
Expand Down
Expand Up @@ -186,7 +186,7 @@ public InputTermBuilder getInputBuilder() {

}
if (inputBuilder == null || inputBuilder.getRuntime() != getRuntime()) {
inputBuilder = new InputTermBuilder(getRuntime(), resultingAsts);
inputBuilder = new InputTermBuilder(this, resultingAsts);
}
return inputBuilder;
}
Expand Down
Expand Up @@ -9,7 +9,6 @@
import org.eclipse.text.edits.MultiTextEdit;
import org.eclipse.text.edits.ReplaceEdit;
import org.spoofax.interpreter.core.Tools;
import org.spoofax.interpreter.stratego.Fail;
import org.spoofax.interpreter.terms.IStrategoTerm;
import org.spoofax.terms.attachments.OriginAttachment;
import org.strategoxt.imp.generator.construct_textual_change_4_0;
Expand Down
Expand Up @@ -22,7 +22,6 @@
import org.strategoxt.imp.runtime.services.views.StrategoLabelProvider;
import org.strategoxt.imp.runtime.services.views.StrategoTreeContentProvider;
import org.strategoxt.imp.runtime.stratego.StrategoTermPath;
import org.strategoxt.lang.Context;

/**
* @author Oskar van Rest
Expand Down Expand Up @@ -148,24 +147,11 @@ public void textSelectionToOutlineSelection() {
}

EditorState editorState = EditorState.getEditorFor(parseController);
IStrategoTerm textSelection = null;

try {
textSelection = editorState.getSelectionAst(true);
}
catch (IndexOutOfBoundsException e) {
// bug in EditorState.getSelectionAst()
}
IStrategoTerm textSelection = editorState.getSelectionAst(true);

if (textSelection != null) {
Context context = SpoofaxOutlineUtil.getObserver(editorState).getRuntime().getCompiledContext();
IStrategoList path = null;
try {
path = StrategoTermPath.getTermPathWithOrigin(context, (IStrategoTerm) outline, textSelection);
}
catch (Exception e) {
// TODO: fix getTermPathWithOrigin(..)
}
path = StrategoTermPath.getTermPathWithOrigin(SpoofaxOutlineUtil.getObserver(editorState), (IStrategoTerm) outline, textSelection);

if (path != null) {
TreePath[] treePaths = termPathToTreePaths(path);
Expand Down
Expand Up @@ -85,14 +85,8 @@ public IStrategoTerm getProperties(int selectionOffset, int selectionLength) {
}

IStrategoTerm properties = null;
try {
IStrategoTerm input = new InputTermBuilder(observer.getRuntime(), ast).makeInputTerm(selectionAst, true, source);
properties = observer.invokeSilent(propertiesRule, input, editorState.getResource().getFullPath().toFile());
}
catch (Exception e) {
// TODO: fix getTermPathWithOrigin
return emptyList;
}
IStrategoTerm input = new InputTermBuilder(observer, ast).makeInputTerm(selectionAst, true, source);
properties = observer.invokeSilent(propertiesRule, input, editorState.getResource().getFullPath().toFile());
if (properties == null) {
observer.reportRewritingFailed();
}
Expand Down
Expand Up @@ -26,6 +26,7 @@
import org.strategoxt.imp.generator.term_at_position_0_1;
import org.strategoxt.imp.runtime.Environment;
import org.strategoxt.imp.runtime.services.ContentProposerSemantic;
import org.strategoxt.imp.runtime.services.StrategoObserver;
import org.strategoxt.lang.Context;
import org.strategoxt.lang.Strategy;
import org.strategoxt.stratego_aterm.explode_aterm_0_0;
Expand Down Expand Up @@ -75,38 +76,45 @@ public static List<Integer> createPathList(IStrategoTerm node) {
* The resulting path relates to the actual AST, ignoring the 'appl' etc constructors
* of the IStrategoTerm syntax.
*/
public static IStrategoList createPathFromParsedIStrategoTerm(final IStrategoTerm node, Context context) {
IStrategoTerm top = ParentAttachment.getRoot(node);
final IStrategoTerm marker = context.getFactory().makeString(ContentProposerSemantic.COMPLETION_TOKEN);
top = oncetd_1_0.instance.invoke(context, top, new Strategy() {
@Override
public IStrategoTerm invoke(Context context, IStrategoTerm current) {
if (hasImploderOrigin(current) && tryGetOrigin(current) == node) {
return explode_aterm_0_0.instance.invoke(context, marker);
} else {
return null;
public static IStrategoList createPathFromParsedIStrategoTerm(final IStrategoTerm node, StrategoObserver observer) {
observer.getLock().lock();
try {
Context context = observer.getRuntime().getCompiledContext();
IStrategoTerm top = ParentAttachment.getRoot(node);
final IStrategoTerm marker = context.getFactory().makeString(ContentProposerSemantic.COMPLETION_TOKEN);
top = oncetd_1_0.instance.invoke(context, top, new Strategy() {
@Override
public IStrategoTerm invoke(Context context, IStrategoTerm current) {
if (hasImploderOrigin(current) && tryGetOrigin(current) == node) {
return explode_aterm_0_0.instance.invoke(context, marker);
} else {
return null;
}
}
}
});
top = implode_aterm_0_0.instance.invoke(context, top);
return (IStrategoList) position_of_term_1_0.instance.invoke(context, top, new Strategy() {
@Override
public IStrategoTerm invoke(Context context, IStrategoTerm current) {
return marker.equals(current) ? current : null;
}
});
});
top = implode_aterm_0_0.instance.invoke(context, top);
return (IStrategoList) position_of_term_1_0.instance.invoke(context, top, new Strategy() {
@Override
public IStrategoTerm invoke(Context context, IStrategoTerm current) {
return marker.equals(current) ? current : null;
}
});
}
finally {
observer.getLock().unlock();
}
}

/**
* Determine the path to a term in 'ast' with origin 'origin'.
*/
public static IStrategoList getTermPathWithOrigin(Context context, IStrategoTerm ast, IStrategoTerm origin) {
public static IStrategoList getTermPathWithOrigin(StrategoObserver observer, IStrategoTerm ast, IStrategoTerm origin) {
if (ast == null)
return null;
if (isTermList(origin)) {
// Lists have no origin information, try to find the node by its first child.
if (origin.getSubtermCount() > 0) {
IStrategoList subtermPath = getTermPathWithOrigin(context, ast, origin.getSubterm(0));
IStrategoList subtermPath = getTermPathWithOrigin(observer, ast, origin.getSubterm(0));
if (subtermPath != null){
// Arrays.copyOf is Java 1.6
//IStrategoTerm[] originPath = Arrays.copyOf(subtermPath.getAllSubterms(), subtermPath.getSubtermCount()-1);
Expand Down Expand Up @@ -172,29 +180,37 @@ public IStrategoTerm invoke(Context context, IStrategoTerm current) {
}
}
TestOrigin testOrigin = new TestOrigin();
testOrigin.origin1 = origin;
generator.init(context);
IStrategoTerm perfectMatch = null;
testOrigin.origin1 = origin;

observer.getLock().lock();
try {
perfectMatch = position_of_term_1_0.instance.invoke(context, ast, testOrigin);
Context context = observer.getRuntime().getCompiledContext();

generator.init(context);
IStrategoTerm perfectMatch = position_of_term_1_0.instance.invoke(context, ast, testOrigin);

if (perfectMatch != null) {
return (IStrategoList) perfectMatch;
} else if (testOrigin.nextBest != null) {
testOrigin.origin1 = testOrigin.nextBest;
return (IStrategoList) position_of_term_1_0.instance.invoke(context, ast, testOrigin);
} else {
return null;
}
}
catch (NullPointerException e) {
Environment.logException("Spoofax/757: position-of-term failed for input: (" + ast + ", " + testOrigin + ")", e);
}
if (perfectMatch != null) {
return (IStrategoList) perfectMatch;
} else if (testOrigin.nextBest != null) {
// Environment.logWarning("Could not determine term corresponding to " + origin.toString() + " in resulting AST; using next best match " + testOrigin.nextBest);
testOrigin.origin1 = testOrigin.nextBest;
return (IStrategoList) position_of_term_1_0.instance.invoke(context, ast, testOrigin);
} else {
// Environment.logWarning("Could not determine term corresponding to " + origin.toString() + " in resulting AST");
return null;
finally {
observer.getLock().unlock();
}
}

public static IStrategoTerm getTermAtPath(Context context, IStrategoTerm term, IStrategoList path) {
return term_at_position_0_1.instance.invoke(context, term, path);
public static IStrategoTerm getTermAtPath(StrategoObserver observer, IStrategoTerm term, IStrategoList path) {
observer.getLock().lock();
try {
return term_at_position_0_1.instance.invoke(observer.getRuntime().getCompiledContext(), term, path);
}
finally {
observer.getLock().unlock();
}
}

private static int indexOfIdentical(IStrategoTerm parent, IStrategoTerm node) {
Expand Down

0 comments on commit eea1a34

Please sign in to comment.