List of usage examples for org.antlr.v4.runtime Token getText
String getText();
From source file:org.ballerinalang.composer.service.workspace.langserver.util.resolvers.parsercontext.ParserRuleExpressionVariableDefStatementContextResolver.java
License:Open Source License
/** * Get the index of the given token/*from w w w .j a v a2 s . co m*/ * @param dataModel suggestions filter data model * @param tokenString token string to be found * @return {@link Integer} */ private int getTokenIndexOf(SuggestionsFilterDataModel dataModel, String tokenString) { TokenStream tokenStream = dataModel.getTokenStream(); int currentTokenIndex = dataModel.getTokenIndex(); int searchIndex = currentTokenIndex - 1; List<String> terminatingCharacters = Arrays.asList(";", "{", "}", "@"); while (true) { if (tokenStream != null && searchIndex < tokenStream.size()) { Token token = tokenStream.get(searchIndex); String tokenStr = token.getText(); if (token.getChannel() == Token.DEFAULT_CHANNEL && terminatingCharacters.contains(tokenStr)) { return -1; } else if (tokenStr.equals(tokenString)) { return searchIndex; } else { searchIndex--; } } else { return -1; } } }
From source file:org.ballerinalang.composer.service.workspace.suggetions.CapturePossibleTokenStrategy.java
License:Open Source License
/** * Checks whether cursor is within the whitespace region between current token to last token * @param token Token to be evaluated/*from w w w . java 2 s . com*/ * @param parser Parser Instance * @return true|false */ protected boolean isCursorBetweenGivenTokenAndLastNonHiddenToken(Token token, Parser parser) { boolean isCursorBetween = false; if (cursorPosition.equals(getSourcePosition(token))) { isCursorBetween = true; } else { Token lastNonHiddenToken = null; for (int tokenIdx = token.getTokenIndex() - 1; tokenIdx >= 0; tokenIdx--) { Token lastToken = parser.getTokenStream().get(tokenIdx); if (lastToken.getChannel() != Token.HIDDEN_CHANNEL) { lastNonHiddenToken = lastToken; break; } } if (lastNonHiddenToken != null) { if (cursorPosition.getLine() >= lastNonHiddenToken.getLine() && cursorPosition.getLine() <= token.getLine()) { if (cursorPosition.getLine() == lastNonHiddenToken.getLine()) { isCursorBetween = cursorPosition .getCharacter() >= (lastNonHiddenToken.getCharPositionInLine() + lastNonHiddenToken.getText().length()); } else if (cursorPosition.getLine() == token.getLine()) { isCursorBetween = cursorPosition.getCharacter() <= token.getCharPositionInLine(); } else { isCursorBetween = true; } } } } return isCursorBetween; }
From source file:org.ballerinalang.langserver.completions.BallerinaCustomErrorStrategy.java
License:Open Source License
/** * Checks whether cursor is within the whitespace region between current token to last token. * @param token Token to be evaluated/* w w w.j av a 2s .c o m*/ * @param parser Parser Instance * @return true|false */ private boolean isCursorBetweenGivenTokenAndLastNonHiddenToken(Token token, Parser parser) { this.setContextException(parser); boolean isCursorBetween = false; int line = this.context.get(DocumentServiceKeys.POSITION_KEY).getPosition().getLine(); int character = this.context.get(DocumentServiceKeys.POSITION_KEY).getPosition().getCharacter(); Token lastNonHiddenToken = null; for (int tokenIdx = token.getTokenIndex() - 1; tokenIdx >= 0; tokenIdx--) { Token lastToken = parser.getTokenStream().get(tokenIdx); if (lastToken.getChannel() != Token.HIDDEN_CHANNEL) { lastNonHiddenToken = lastToken; break; } } if (lastNonHiddenToken != null) { // Convert the token lines and char positions to zero based indexing int lastNonHiddenTokenLine = lastNonHiddenToken.getLine() - 1; int lastNonHiddenTokenChar = lastNonHiddenToken.getCharPositionInLine(); int tokenLine = token.getLine() - 1; int tokenChar = token.getCharPositionInLine(); if (line >= lastNonHiddenTokenLine && line <= tokenLine) { if (line == lastNonHiddenTokenLine) { isCursorBetween = character >= (lastNonHiddenTokenChar + lastNonHiddenToken.getText().length()); } else { isCursorBetween = line != tokenLine || character <= tokenChar; } } } return isCursorBetween; }
From source file:org.ballerinalang.langserver.completions.CompletionCustomErrorStrategy.java
License:Open Source License
private Token getLastTerminationToken(TokenStream tokenStream) { Token lastTerminationToken = null;/*from w ww.j a v a2s .c om*/ Position cursorPosition = this.context.get(DocumentServiceKeys.POSITION_KEY).getPosition(); int cursorLine = cursorPosition.getLine() + 1; int cursorCol = cursorPosition.getCharacter() + 1; int index = 1; Token beforeCursorToken = tokenStream.LT(index); int type = beforeCursorToken.getType(); int tLine = beforeCursorToken.getLine(); int tCol = beforeCursorToken.getCharPositionInLine(); while (type != BallerinaParser.EOF && ((tLine < cursorLine) || (tLine == cursorLine && tCol < cursorCol))) { // Checking for terminating tokens with the type number is inconsistent. Thus, uses string comparisons String tokenText = beforeCursorToken.getText(); if (UtilSymbolKeys.SEMI_COLON_SYMBOL_KEY.equals(tokenText) || UtilSymbolKeys.OPEN_BRACE_KEY.equals(tokenText) || UtilSymbolKeys.CLOSE_BRACE_KEY.equals(tokenText) || UtilSymbolKeys.COMMA_SYMBOL_KEY.equals(tokenText)) { lastTerminationToken = beforeCursorToken; } index++; beforeCursorToken = tokenStream.LT(index); type = beforeCursorToken.getType(); tLine = beforeCursorToken.getLine(); tCol = beforeCursorToken.getCharPositionInLine(); } return lastTerminationToken; }
From source file:org.ballerinalang.langserver.completions.CompletionSubRuleParser.java
License:Open Source License
private static boolean fillAnnotationAttachmentMetaInfo(LSContext ctx) { if (ctx.get(CompletionKeys.TOKEN_STREAM_KEY) == null) { return false; }//from ww w. ja va 2 s.com TokenStream tokenStream = ctx.get(CompletionKeys.TOKEN_STREAM_KEY); Position cursorPosition = ctx.get(DocumentServiceKeys.POSITION_KEY).getPosition(); Queue<String> fieldsQueue = new LinkedList<>(); ArrayList<String> terminalTokens = new ArrayList<>( Arrays.asList(UtilSymbolKeys.FUNCTION_KEYWORD_KEY, UtilSymbolKeys.SERVICE_KEYWORD_KEY, UtilSymbolKeys.ENDPOINT_KEYWORD_KEY, UtilSymbolKeys.OPEN_PARENTHESES_KEY)); int currentTokenIndex = CommonUtil.getCurrentTokenFromTokenStream(ctx); int startIndex = currentTokenIndex; int line = cursorPosition.getLine(); int col = cursorPosition.getCharacter(); String annotationName; String pkgAlias = ""; while (true) { if (startIndex > tokenStream.size() || CommonUtil.getPreviousDefaultToken(tokenStream, startIndex) == null) { return false; } Token token = CommonUtil.getPreviousDefaultToken(tokenStream, startIndex); if (token == null || terminalTokens.contains(token.getText())) { return false; } if (token.getText().equals(UtilSymbolKeys.ANNOTATION_START_SYMBOL_KEY)) { // Breaks when we meet the first annotation start before the given start index break; } else if (token.getText().equals(UtilSymbolKeys.OPEN_BRACE_KEY)) { startIndex = token.getTokenIndex(); // For each annotation found, capture the package alias if (UtilSymbolKeys.PKG_DELIMITER_KEYWORD .equals(CommonUtil.getNthDefaultTokensToLeft(tokenStream, startIndex, 2).getText())) { pkgAlias = CommonUtil.getNthDefaultTokensToLeft(tokenStream, startIndex, 3).getText(); } } else { startIndex = token.getTokenIndex(); } } String tempTokenString = ""; while (true) { if (startIndex > tokenStream.size()) { return false; } Token token = CommonUtil.getNextDefaultToken(tokenStream, startIndex); int tokenLine = token.getLine() - 1; int tokenCol = token.getCharPositionInLine(); if (terminalTokens.contains(token.getText()) || line < tokenLine || (line == tokenLine - 1 && col - 1 < tokenCol)) { break; } else if (UtilSymbolKeys.OPEN_BRACE_KEY.equals(token.getText())) { fieldsQueue.add(tempTokenString); } else if (UtilSymbolKeys.CLOSE_BRACE_KEY.equals(token.getText())) { fieldsQueue.remove(); } else if (!UtilSymbolKeys.PKG_DELIMITER_KEYWORD.equals(token.getText())) { tempTokenString = token.getText(); } startIndex = token.getTokenIndex(); } annotationName = fieldsQueue.poll(); ctx.put(CompletionKeys.ANNOTATION_ATTACHMENT_META_KEY, new AnnotationAttachmentMetaInfo(annotationName, fieldsQueue, pkgAlias, getNextNodeTypeFlag(tokenStream, currentTokenIndex, ctx))); ctx.put(CompletionKeys.SYMBOL_ENV_NODE_KEY, new BLangAnnotationAttachment()); return true; }
From source file:org.ballerinalang.langserver.completions.CompletionSubRuleParser.java
License:Open Source License
private static AnnotationNodeKind getNextNodeTypeFlag(TokenStream tokenStream, int index, LSContext context) { AnnotationNodeKind nodeType = context.get(CompletionKeys.NEXT_NODE_KEY); Map<String, AnnotationNodeKind> flagsMap = new HashMap<>(); flagsMap.put(UtilSymbolKeys.SERVICE_KEYWORD_KEY, AnnotationNodeKind.SERVICE); flagsMap.put(UtilSymbolKeys.RESOURCE_KEYWORD_KEY, AnnotationNodeKind.RESOURCE); while (true) { if (tokenStream == null || index >= tokenStream.size()) { break; }/*from w w w . jav a 2 s .co m*/ Token token = CommonUtil.getNextDefaultToken(tokenStream, index); if (token.getText().equals(UtilSymbolKeys.SEMI_COLON_SYMBOL_KEY)) { break; } else if (flagsMap.containsKey(token.getText())) { nodeType = flagsMap.get(token.getText()); break; } index = token.getTokenIndex(); } return nodeType; }
From source file:org.ballerinalang.langserver.completions.CompletionSubRuleParser.java
License:Open Source License
private static void reCalculatePoppedTokensForTopLevel(LSContext ctx) { if (ctx.get(CompletionKeys.TOKEN_STREAM_KEY) == null) { return;/*from www. ja va 2s . c om*/ } int currentTokenIndex = CommonUtil.getCurrentTokenFromTokenStream(ctx); TokenStream tokenStream = ctx.get(CompletionKeys.TOKEN_STREAM_KEY); Stack<Token> tokenStack = new Stack<>(); while (true) { if (currentTokenIndex < 0) { break; } Token token = CommonUtil.getPreviousDefaultToken(tokenStream, currentTokenIndex); if (token == null) { return; } String tokenString = token.getText(); tokenStack.push(token); if (tokenString.equals(ItemResolverConstants.SERVICE) || tokenString.equals(ItemResolverConstants.FUNCTION) || tokenString.equals(ItemResolverConstants.TYPE) || tokenString.equals(ItemResolverConstants.ENDPOINT)) { break; } currentTokenIndex = token.getTokenIndex(); } Collections.reverse(tokenStack); ctx.put(CompletionKeys.FORCE_CONSUMED_TOKENS_KEY, tokenStack); }
From source file:org.ballerinalang.langserver.completions.providers.subproviders.parsercontext.ParserRuleServiceDefinitionCompletionProvider.java
License:Open Source License
@Override public List<CompletionItem> resolveItems(LSContext ctx) { List<CompletionItem> completionItems = new ArrayList<>(); TokenStream tokenStream = ctx.get(CompletionKeys.TOKEN_STREAM_KEY); Stack<Token> poppedTokens = ctx.get(CompletionKeys.FORCE_CONSUMED_TOKENS_KEY); int startIndex = poppedTokens.peek().getTokenIndex() + 1; String stopToken = ""; // Backtrack the tokens from the head of the popped tokens in order determine the cursor position tokenScanner: while (true) { Token token = CommonUtil.getPreviousDefaultToken(tokenStream, startIndex); String tokenString = token.getText(); switch (tokenString) { case ItemResolverConstants.SERVICE: case ItemResolverConstants.ON: case ItemResolverConstants.NEW: case UtilSymbolKeys.PKG_DELIMITER_KEYWORD: stopToken = tokenString;/*from ww w.j av a 2 s .c o m*/ break tokenScanner; default: break; } startIndex = token.getTokenIndex(); } boolean isSnippet = ctx.get(CompletionKeys.CLIENT_CAPABILITIES_KEY).getCompletionItem().getSnippetSupport(); switch (stopToken) { case ItemResolverConstants.ON: { // suggest all the visible, defined listeners List<SymbolInfo> filtered = this.filterListenerVariables(ctx.get(CompletionKeys.VISIBLE_SYMBOLS_KEY)); completionItems.addAll(this.getCompletionItemList(filtered, ctx)); completionItems.add(Snippet.KW_NEW.get().build(ctx, isSnippet)); break; } case ItemResolverConstants.NEW: { List<SymbolInfo> filteredSymbols = this .filterListenerTypes(ctx.get(CompletionKeys.VISIBLE_SYMBOLS_KEY)); completionItems.addAll(this.getCompletionItemList(filteredSymbols, ctx)); completionItems.addAll(this.getPackagesCompletionItems(ctx)); break; } case UtilSymbolKeys.PKG_DELIMITER_KEYWORD: { Either<List<CompletionItem>, List<SymbolInfo>> eitherList = SymbolFilters .get(DelimiterBasedContentFilter.class).filterItems(ctx); completionItems.addAll(this.getCompletionItemList(eitherList, ctx)); break; } default: { // Fill the on keyword completion item completionItems.add(Snippet.KW_ON.get().build(ctx, isSnippet)); break; } } return completionItems; }
From source file:org.ballerinalang.langserver.completions.resolvers.parsercontext.ParserRuleCallableUnitBodyContextResolver.java
License:Open Source License
@Override public ArrayList<CompletionItem> resolveItems(TextDocumentServiceContext completionContext) { int tokenIndex = completionContext.get(DocumentServiceKeys.TOKEN_INDEX_KEY); int endpointTokenIndex = -1; String tokenString;/*from www . java 2s .co m*/ TokenStream tokenStream = completionContext.get(DocumentServiceKeys.TOKEN_STREAM_KEY); Position position = completionContext.get(DocumentServiceKeys.POSITION_KEY).getPosition(); ArrayList<CompletionItem> completionItems = new ArrayList<>(); while (true) { if (tokenIndex > tokenStream.size() - 1) { break; } tokenString = tokenStream.get(tokenIndex).getText(); if (isCursorBeforeToken(position, tokenStream.get(tokenIndex))) { break; } else if (tokenString.equals(ENDPOINT_KEYWORD)) { endpointTokenIndex = tokenIndex; } tokenIndex++; } if (endpointTokenIndex > 0) { Token tokenBeforeCursor = CommonUtil.getPreviousDefaultToken(tokenStream, tokenIndex - 1); switch (tokenBeforeCursor.getText()) { case "create": case "<": this.populateCompletionItemList(getPackagesAndConnectors(completionContext), completionItems); break; default: break; } } return completionItems; }
From source file:org.ballerinalang.langserver.completions.resolvers.parsercontext.ParserRuleServiceDefinitionContextResolver.java
License:Open Source License
@Override public List<CompletionItem> resolveItems(LSServiceOperationContext ctx) { List<CompletionItem> completionItems = new ArrayList<>(); TokenStream tokenStream = ctx.get(CompletionKeys.TOKEN_STREAM_KEY); Stack<Token> poppedTokens = ctx.get(CompletionKeys.FORCE_CONSUMED_TOKENS_KEY); int startIndex = poppedTokens.peek().getTokenIndex() + 1; String stopToken = ""; // Backtrack the tokens from the head of the popped tokens in order determine the cursor position tokenScanner: while (true) { Token token = CommonUtil.getPreviousDefaultToken(tokenStream, startIndex); String tokenString = token.getText(); switch (tokenString) { case ItemResolverConstants.SERVICE: case ItemResolverConstants.ON: case ItemResolverConstants.NEW: case UtilSymbolKeys.PKG_DELIMITER_KEYWORD: stopToken = tokenString;//from ww w . ja v a2s . co m break tokenScanner; default: break; } startIndex = token.getTokenIndex(); } boolean isSnippet = ctx.get(CompletionKeys.CLIENT_CAPABILITIES_KEY).getCompletionItem().getSnippetSupport(); switch (stopToken) { case ItemResolverConstants.ON: { // suggest all the visible, defined listeners List<SymbolInfo> filtered = this.filterListenerVariables(ctx.get(CompletionKeys.VISIBLE_SYMBOLS_KEY)); completionItems.addAll(this.getCompletionItemList(filtered, ctx)); completionItems.add(Snippet.KW_NEW.get().build(ctx, isSnippet)); break; } case ItemResolverConstants.NEW: { List<SymbolInfo> filteredSymbols = this .filterListenerTypes(ctx.get(CompletionKeys.VISIBLE_SYMBOLS_KEY)); completionItems.addAll(this.getCompletionItemList(filteredSymbols, ctx)); completionItems.addAll(this.getPackagesCompletionItems(ctx)); break; } case UtilSymbolKeys.PKG_DELIMITER_KEYWORD: { Either<List<CompletionItem>, List<SymbolInfo>> eitherList = SymbolFilters .get(DelimiterBasedContentFilter.class).filterItems(ctx); completionItems.addAll(this.getCompletionItemList(eitherList, ctx)); break; } default: { // Fill the on keyword completion item completionItems.add(Snippet.KW_ON.get().build(ctx, isSnippet)); break; } } return completionItems; }