public OffsetRange getReferenceSpan(Document doc, int lexOffset) { TokenHierarchy<Document> th = TokenHierarchy.get(doc); // BaseDocument doc = (BaseDocument)document; TokenSequence<? extends PythonTokenId> ts = PythonLexerUtils.getPythonSequence(th, lexOffset); if (ts == null) { return OffsetRange.NONE; } ts.move(lexOffset); if (!ts.moveNext() && !ts.movePrevious()) { return OffsetRange.NONE; } // Determine whether the caret position is right between two tokens boolean isBetween = (lexOffset == ts.offset()); OffsetRange range = getReferenceSpan(ts, th, lexOffset); if ((range == OffsetRange.NONE) && isBetween) { // The caret is between two tokens, and the token on the right // wasn't linkable. Try on the left instead. if (ts.movePrevious()) { range = getReferenceSpan(ts, th, lexOffset); } } return range; }
@SuppressWarnings("empty-statement") private DeclarationLocation findUrl(PythonParserResult info, Document doc, int lexOffset) { TokenSequence<?> ts = PythonLexerUtils.getPythonSequence((BaseDocument) doc, lexOffset); if (ts == null) { return DeclarationLocation.NONE; } ts.move(lexOffset); if (!ts.moveNext() && !ts.movePrevious()) { return DeclarationLocation.NONE; } Token<?> token = ts.token(); TokenSequence<?> embedded = ts.embedded(); if (embedded != null) { ts = embedded; embedded.move(lexOffset); if (!embedded.moveNext() && !embedded.movePrevious()) { return DeclarationLocation.NONE; } token = embedded.token(); } // Is this a comment? If so, possibly do rdoc-method reference jump if ((token != null) && (token.id() == PythonStringTokenId.URL)) { // TODO - use findLinkedMethod String method = token.text().toString(); if (method.startsWith("www.")) { // NOI18N method = "http://" + method; // NOI18N } // A URL such as http://netbeans.org - try to open it in a browser! try { URL url = new URL(method); return new DeclarationLocation(url); } catch (MalformedURLException mue) { // URL is from user source... don't complain with exception dialogs etc. ; } } return DeclarationLocation.NONE; }