public List<? extends Location> getDefinitions(final Document document, final XtextResource resource, final TextDocumentPositionParams params, final IReferenceFinder.IResourceAccess resourceAccess, final CancelIndicator cancelIndicator) { final int offset = document.getOffSet(params.getPosition()); return this.getDefinitions(resource, offset, resourceAccess, cancelIndicator); }
@Override public List<? extends DocumentHighlight> getDocumentHighlights(Document document, XtextResource resource, TextDocumentPositionParams params, CancelIndicator cancelIndicator) { int offset = document.getOffSet(params.getPosition()); return getDocumentHighlights(resource, offset); }
public List<? extends Location> definition(TextDocumentPositionParams position, IProgressMonitor monitor) { ITypeRoot unit = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri()); Location location = null; if (unit != null && !monitor.isCanceled()) { location = computeDefinitionNavigation(unit, position.getPosition().getLine(), position.getPosition().getCharacter(), monitor); } return location == null ? null : Arrays.asList(location); }
public List<? extends Location> typeDefinition(TextDocumentPositionParams position, IProgressMonitor monitor) { ITypeRoot unit = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri()); Location location = null; if (unit != null && !monitor.isCanceled()) { location = computeTypeDefinitionNavigation(unit, position.getPosition().getLine(), position.getPosition().getCharacter(), monitor); } return location == null ? null : Arrays.asList(location); }
private int getOffset(TextDocumentPositionParams param, ITypeRoot typeRoot) { int offset = 0; try { IDocument document = JsonRpcHelpers.toDocument(typeRoot.getBuffer()); offset = document.getLineOffset(param.getPosition().getLine()) + param.getPosition().getCharacter(); } catch (JavaModelException | BadLocationException e) { JavaLanguageServerPlugin.logException(e.getMessage(), e); } return offset; }
public List<? extends DocumentHighlight> documentHighlight(TextDocumentPositionParams position, IProgressMonitor monitor) { ITypeRoot type = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri()); return computeOccurrences(type, position.getPosition().getLine(), position.getPosition().getCharacter(), monitor); }
public Hover hover(TextDocumentPositionParams position, IProgressMonitor monitor) { ITypeRoot unit = JDTUtils.resolveTypeRoot(position.getTextDocument().getUri()); List<Either<String, MarkedString>> content = null; if (unit != null && !monitor.isCanceled()) { content = computeHover(unit, position.getPosition().getLine(), position.getPosition().getCharacter(), monitor); } else { content = Collections.singletonList(Either.forLeft("")); } Hover $ = new Hover(); $.setContents(content); return $; }
@Override public Hover hover(final Document document, final XtextResource resource, final TextDocumentPositionParams params, final CancelIndicator cancelIndicator) { final int offset = document.getOffSet(params.getPosition()); final HoverContext context = this.createContext(document, resource, offset); return this.hover(context); }
private List<BField> getFieldList(BLangRecordLiteral recordLiteral, LSContext context) { Position cursor = context.get(DocumentServiceKeys.POSITION_KEY).getPosition(); List<BField> filteredFields = new ArrayList<>(); int line = cursor.getLine(); List<BLangExpression> values = recordLiteral.keyValuePairs.stream() .map(BLangRecordLiteral.BLangRecordKeyValue::getValue) .collect(Collectors.toList()); for (BLangExpression value : values) { DiagnosticPos diagnosticPos = CommonUtil.toZeroBasedPosition(value.getPosition()); int exprSLine = diagnosticPos.getStartLine(); int exprELine = diagnosticPos.getEndLine(); if (exprSLine < line && exprELine > line) { filteredFields.addAll(this.getFieldList((BLangRecordLiteral) value, context)); break; } } if (filteredFields.isEmpty()) { filteredFields.addAll(((BStructureType) recordLiteral.type).getFields()); } return filteredFields; } }
@Override public CompletableFuture<List<? extends Location>> definition(TextDocumentPositionParams position) { URI uri = Uris.resolveToRoot(getWorkspacePath(), position.getTextDocument().getUri()); return CompletableFuture.completedFuture(getState().getCompilerWrapper() .gotoDefinition(uri, position.getPosition()).transform(Lists::newArrayList).or(Lists.newArrayList())); }
public PositionTreeVisitor(LSContext context) { this.context = context; this.position = context.get(DocumentServiceKeys.POSITION_KEY).getPosition(); this.symTable = SymbolTable.getInstance(context.get(DocumentServiceKeys.COMPILER_CONTEXT_KEY)); this.position.setLine(this.position.getLine() + 1); this.nodeStack = new Stack<>(); this.context.put(NodeContextKeys.NODE_STACK_KEY, nodeStack); }
@Override public CompletableFuture<Either<List<CompletionItem>, CompletionList>> completion( TextDocumentPositionParams position) { return CompletableFuture.completedFuture(Either.forRight( getState().getCompilerWrapper() .getCompletion( Uris.resolveToRoot(getWorkspacePath(), position.getTextDocument().getUri()), position.getPosition()))); }
TextDocumentPositionParams clone(TextDocumentPositionParams textDocumentPositionParams) { if (textDocumentPositionParams == null) { return null; } Position position = textDocumentPositionParams.getPosition(); TextDocumentIdentifier textDocument = textDocumentPositionParams.getTextDocument(); TextDocumentPositionParams cloned = new TextDocumentPositionParams(); cloned.setPosition(clone(position)); cloned.setTextDocument(clone(textDocument)); return cloned; }
/** * {@inheritDoc} */ @Override public boolean isCursorBeforeNode(DiagnosticPos nodePosition, TreeVisitor treeVisitor, LSContext completionContext, BLangNode node, BSymbol bSymbol) { int line = completionContext.get(DocumentServiceKeys.POSITION_KEY).getPosition().getLine(); DiagnosticPos zeroBasedPos = CommonUtil.toZeroBasedPosition(nodePosition); int nodeSLine = zeroBasedPos.sLine; if (line <= nodeSLine) { treeVisitor.forceTerminateVisitor(); treeVisitor.setNextNode(bSymbol); return true; } return false; } }
/** * Check whether the cursor is at the resource identifier. * * @param bLangResource Resource to be consider * @param context Language Server Operation Context * @param treeVisitor Completion Tree Visitor instance * @return {@link Boolean} Whether the cursor is at the resource identifier or not */ public static boolean isCursorAtResourceIdentifier(BLangResource bLangResource, LSContext context, TreeVisitor treeVisitor) { Position position = context.get(DocumentServiceKeys.POSITION_KEY).getPosition(); DiagnosticPos zeroBasedPo = CommonUtil.toZeroBasedPosition(bLangResource.getPosition()); int line = position.getLine(); int nodeSLine = zeroBasedPo.sLine; boolean status = line == nodeSLine; if (status) { treeVisitor.forceTerminateVisitor(); } return status; }
@Override public void visit(BLangInvocation invocationNode) { int curLine = lsContext.get(DocumentServiceKeys.POSITION_KEY).getPosition().getLine(); CursorPositionResolver cpr = CursorPositionResolvers.getResolverByClass(cursorPositionResolver); if (cpr.isCursorBeforeNode(invocationNode.getPosition(), this, this.lsContext, invocationNode, invocationNode.symbol) || curLine != invocationNode.getPosition().getStartLine() - 1) { return; } final TreeVisitor visitor = this; Class fallbackCursorPositionResolver = this.cursorPositionResolver; this.cursorPositionResolver = InvocationParameterScopeResolver.class; this.blockOwnerStack.push(invocationNode); // Visit all arguments invocationNode.getArgumentExpressions().forEach(expressionNode -> { BLangNode node = ((BLangNode) expressionNode); CursorPositionResolver posResolver = CursorPositionResolvers.getResolverByClass(cursorPositionResolver); posResolver.isCursorBeforeNode(node.getPosition(), visitor, visitor.lsContext, node, null); visitor.acceptNode(node, symbolEnv); }); this.blockOwnerStack.pop(); this.cursorPositionResolver = fallbackCursorPositionResolver; }
public List<? extends Location> findImplementations(TextDocumentPositionParams param, IProgressMonitor monitor) { List<Location> locations = null; IJavaElement elementToSearch = null; try { ITypeRoot typeRoot = JDTUtils.resolveTypeRoot(param.getTextDocument().getUri()); if (typeRoot != null) { elementToSearch = JDTUtils.findElementAtSelection(typeRoot, param.getPosition().getLine(), param.getPosition().getCharacter(), this.preferenceManager, monitor); } if (elementToSearch == null) { return Collections.emptyList(); } int offset = getOffset(param, typeRoot); IRegion region = new Region(offset, 0); IType primaryType = typeRoot.findPrimaryType(); //java.lang.Object is a special case. We need to minimize heavy cost of I/O, // by avoiding opening all files from the Object hierarchy boolean useDefaultLocation = primaryType == null ? false : "java.lang.Object".equals(primaryType.getFullyQualifiedName()); ImplementationToLocationMapper mapper = new ImplementationToLocationMapper(preferenceManager.isClientSupportsClassFileContent(), useDefaultLocation); ImplementationCollector<Location> collector = new ImplementationCollector<>(region, elementToSearch, mapper); locations = collector.findImplementations(monitor); } catch (CoreException e) { JavaLanguageServerPlugin.logException("Find implementations failure ", e); } return locations; }
private boolean isCursorWithinBlock() { Position cursorPosition = this.lsContext.get(DocumentServiceKeys.POSITION_KEY).getPosition(); DiagnosticPos blockPosition = CommonUtil.toZeroBasedPosition(blockPositionStack.peek()); int cursorLine = cursorPosition.getLine(); int cursorColumn = cursorPosition.getCharacter(); int nodeStrtLine = blockPosition.getStartLine(); int nodeEndLine = blockPosition.getEndLine(); int nodeStrtColumn = blockPosition.getStartColumn(); int nodeEndColumn = blockPosition.getEndColumn(); /* node Start ->{ <cursor_position> }<- node End. If the cursor is within the scope of the node, then the cursor should be located after the node start and before the node end */ int isAfterBlockStart = nodeStrtLine == cursorLine ? cursorColumn - nodeStrtColumn : cursorLine - nodeStrtLine; int isBeforeBlockEnd = nodeEndLine == cursorLine ? nodeEndColumn - cursorColumn : nodeEndLine - cursorLine; return isAfterBlockStart > 0 && isBeforeBlockEnd > 0; }
public TextDocumentPositionParamsDto(org.eclipse.lsp4j.TextDocumentPositionParams o) { if (o.getPosition() == null) { setPosition((org.eclipse.lsp4j.Position)null); } else { org.eclipse.lsp4j.Position positionVal = new PositionDto(o.getPosition()); setPosition((org.eclipse.lsp4j.Position)positionVal); } if (o.getUri() == null) { setUri((java.lang.String)null); } else { java.lang.String uriVal = (java.lang.String)makeDto(o.getUri());; setUri((java.lang.String)uriVal); } if (o.getTextDocument() == null) { setTextDocument((org.eclipse.lsp4j.TextDocumentIdentifier)null); } else { org.eclipse.lsp4j.TextDocumentIdentifier textDocumentVal = new TextDocumentIdentifierDto(o.getTextDocument()); setTextDocument((org.eclipse.lsp4j.TextDocumentIdentifier)textDocumentVal); } }
/** * {@inheritDoc} */ @Override public boolean isCursorBeforeNode(DiagnosticPos nodePosition, TreeVisitor treeVisitor, LSContext completionContext, BLangNode node, BSymbol bSymbol) { Position position = completionContext.get(DocumentServiceKeys.POSITION_KEY).getPosition(); int line = position.getLine(); int col = position.getCharacter(); DiagnosticPos zeroBasedPos = CommonUtil.toZeroBasedPosition(node.getPosition()); int nodeEndLine = zeroBasedPos.eLine; int nodeEndCol = zeroBasedPos.eCol; if (this.isWithinScopeAfterLastParameterNode(node, treeVisitor, line, col, nodeEndLine, nodeEndCol)) { Map<Name, Scope.ScopeEntry> visibleSymbolEntries = treeVisitor.resolveAllVisibleSymbols(treeVisitor.getSymbolEnv()); treeVisitor.populateSymbols(visibleSymbolEntries, treeVisitor.getSymbolEnv()); treeVisitor.setNextNode(bSymbol); treeVisitor.forceTerminateVisitor(); return true; } return false; }