< prev index next >

src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/NashornCompleter.java

Print this page

        

*** 43,65 **** import jdk.nashorn.api.tree.SimpleTreeVisitorES5_1; import jdk.nashorn.api.tree.Tree; import jdk.nashorn.api.tree.UnaryTree; import jdk.nashorn.api.tree.Parser; import jdk.nashorn.api.scripting.NashornException; import jdk.nashorn.internal.objects.Global; import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.ScriptRuntime; // A simple source completer for nashorn final class NashornCompleter implements Completer { private final Context context; private final Global global; private final Parser parser; ! NashornCompleter(final Context context, final Global global) { this.context = context; this.global = global; this.parser = Parser.create(); } // Pattern to match a unfinished member selection expression. object part and "." // but property name missing pattern. --- 43,68 ---- import jdk.nashorn.api.tree.SimpleTreeVisitorES5_1; import jdk.nashorn.api.tree.Tree; import jdk.nashorn.api.tree.UnaryTree; import jdk.nashorn.api.tree.Parser; import jdk.nashorn.api.scripting.NashornException; + import jdk.nashorn.tools.PartialParser; import jdk.nashorn.internal.objects.Global; import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.ScriptRuntime; // A simple source completer for nashorn final class NashornCompleter implements Completer { private final Context context; private final Global global; + private final PartialParser partialParser; private final Parser parser; ! NashornCompleter(final Context context, final Global global, final PartialParser partialParser) { this.context = context; this.global = global; + this.partialParser = partialParser; this.parser = Parser.create(); } // Pattern to match a unfinished member selection expression. object part and "." // but property name missing pattern.
*** 70,109 **** // check that cursor is at the end of test string. Do not complete in the middle! if (cursor != test.length()) { return cursor; } // do we have an incomplete member selection expression that misses property name? ! final boolean endsWithDot = SELECT_PROP_MISSING.matcher(test).matches(); ! // If this is an incomplete member selection, then it is not legal code // Make it legal by adding a random property name "x" to it. ! final String exprToEval = endsWithDot? test + "x" : test; ! final ExpressionTree topExpr = getTopLevelExpression(parser, exprToEval); if (topExpr == null) { // did not parse to be a top level expression, no suggestions! return cursor; } // Find 'right most' expression of the top level expression final Tree rightMostExpr = getRightMostExpression(topExpr); if (rightMostExpr instanceof MemberSelectTree) { ! return completeMemberSelect(test, cursor, result, (MemberSelectTree)rightMostExpr, endsWithDot); } else if (rightMostExpr instanceof IdentifierTree) { ! return completeIdentifier(test, cursor, result, (IdentifierTree)rightMostExpr); } else { // expression that we cannot handle for completion return cursor; } } ! private int completeMemberSelect(final String test, final int cursor, final List<CharSequence> result, final MemberSelectTree select, final boolean endsWithDot) { final ExpressionTree objExpr = select.getExpression(); ! final String objExprCode = test.substring((int)objExpr.getStartPosition(), (int)objExpr.getEndPosition()); // try to evaluate the object expression part as a script Object obj = null; try { obj = context.eval(global, objExprCode, global, "<suggestions>"); --- 73,124 ---- // check that cursor is at the end of test string. Do not complete in the middle! if (cursor != test.length()) { return cursor; } + // get the start of the last expression embedded in the given code + // using the partial parsing support - so that we can complete expressions + // inside statements, function call argument lists, array index etc. + final int exprStart = partialParser.getLastExpressionStart(context, test); + if (exprStart == -1) { + return cursor; + } + + + // extract the last expression string + final String exprStr = test.substring(exprStart); + // do we have an incomplete member selection expression that misses property name? ! final boolean endsWithDot = SELECT_PROP_MISSING.matcher(exprStr).matches(); ! // If this is an incomplete member selection, then it is not legal code. // Make it legal by adding a random property name "x" to it. ! final String completeExpr = endsWithDot? exprStr + "x" : exprStr; ! final ExpressionTree topExpr = getTopLevelExpression(parser, completeExpr); if (topExpr == null) { // did not parse to be a top level expression, no suggestions! return cursor; } // Find 'right most' expression of the top level expression final Tree rightMostExpr = getRightMostExpression(topExpr); if (rightMostExpr instanceof MemberSelectTree) { ! return completeMemberSelect(exprStr, cursor, result, (MemberSelectTree)rightMostExpr, endsWithDot); } else if (rightMostExpr instanceof IdentifierTree) { ! return completeIdentifier(exprStr, cursor, result, (IdentifierTree)rightMostExpr); } else { // expression that we cannot handle for completion return cursor; } } ! private int completeMemberSelect(final String exprStr, final int cursor, final List<CharSequence> result, final MemberSelectTree select, final boolean endsWithDot) { final ExpressionTree objExpr = select.getExpression(); ! final String objExprCode = exprStr.substring((int)objExpr.getStartPosition(), (int)objExpr.getEndPosition()); // try to evaluate the object expression part as a script Object obj = null; try { obj = context.eval(global, objExprCode, global, "<suggestions>");
< prev index next >