public CsmOffsetableDeclaration getFunction(CsmFile file, int position) { if (file != null) { CsmOffsetableDeclaration best = null; for(CsmOffsetableDeclaration decl : file.getDeclarations()) { if (decl.getStartOffset() <= position && position <= decl.getEndOffset()) { return getInternalDeclaration(decl, position); } else if (decl.getStartOffset() > position - GAP) { if (best == null || best.getStartOffset() > decl.getStartOffset()){ best = decl; } } } return best; } return null; }
Offsets(CsmOffsetableDeclaration declaration){ startOffset = declaration.getStartOffset(); endOffset = declaration.getEndOffset(); object = declaration; } Offsets(CsmMacro macros){
private Instantiation(T declaration, Map<CsmTemplateParameter, CsmSpecializationParameter> mapping) { super(declaration.getContainingFile(), declaration.getStartOffset(), declaration.getEndOffset()); this.declaration = declaration; this.mapping = mapping; }
private void getFunction(List<CsmObject> list, CsmFile file, int position) { if (file != null) { for(CsmOffsetableDeclaration decl : file.getDeclarations()) { if (decl.getStartOffset() <= position && position <= decl.getEndOffset()) { list.add(decl); getInternalDeclaration(list, decl, position); return; } } } }
assert decl != null; this.document = document; this.pos = getPosition(document, decl.getStartOffset()); if (baseTemplates.isEmpty() && templateSpecializations.isEmpty()) {
private void findInner(List<CsmObject> list, CsmDeclarationStatement stmt, int offset) { List<CsmDeclaration> decls = stmt.getDeclarators(); if (decls != null) { for(CsmDeclaration decl : decls) { if (CsmKindUtilities.isOffsetableDeclaration(decl)) { CsmOffsetableDeclaration d = (CsmOffsetableDeclaration) decl; if (d.getStartOffset() <= offset && offset <= d.getEndOffset()) { list.add(d); getInternalDeclaration(list, d, offset); return; } } } } }
return getInternalDeclaration(decl, position); } else if (decl.getStartOffset() > position - GAP) { if (best == null || best.getStartOffset() > decl.getStartOffset()){ best = decl; CsmOffsetableDeclaration best = null; for(CsmOffsetableDeclaration decl : ns.getDeclarations()) { if (decl.getStartOffset() < position && position < decl.getEndOffset()) { return getInternalDeclaration(decl, position); } else if (decl.getStartOffset() > position - GAP) { if (best == null || best.getStartOffset() > decl.getStartOffset()){ best = decl;
private CsmNamespaceDefinition findNamespaceDefinition(Iterator<CsmOffsetableDeclaration> it, CsmFilter filter) { while(it.hasNext()) { CsmOffsetableDeclaration decl = it.next(); if (decl.getStartOffset() > this.getStartOffset()) { break; } if (decl.getKind() == CsmDeclaration.Kind.NAMESPACE_DEFINITION) { if (this.getEndOffset() < decl.getEndOffset()) { CsmNamespaceDefinition nsdef = (CsmNamespaceDefinition) decl; CsmNamespaceDefinition inner = findNamespaceDefinition(CsmSelect.getDeclarations(nsdef, filter), filter); return (inner == null) ? nsdef : inner; } } } return null; }
private CsmNamespaceDefinition findNamespaceDefinition(Iterator<CsmOffsetableDeclaration> it, CsmFilter filter) { while(it.hasNext()) { CsmOffsetableDeclaration decl = it.next(); if (decl.getStartOffset() > this.getStartOffset()) { break; } if (decl.getKind() == CsmDeclaration.Kind.NAMESPACE_DEFINITION) { if (this.getEndOffset() < decl.getEndOffset()) { CsmNamespaceDefinition nsdef = (CsmNamespaceDefinition) decl; CsmNamespaceDefinition inner = findNamespaceDefinition(CsmSelect.getDeclarations(nsdef, filter), filter); return (inner == null) ? nsdef : inner; } } } return null; }
protected final Collection<? extends CsmObject> getEqualObjects(CsmObject csmObject) { if (CsmKindUtilities.isOffsetableDeclaration(csmObject)) { CsmOffsetableDeclaration decl = (CsmOffsetableDeclaration) csmObject; // CharSequence uniqueName = decl.getUniqueName(); CsmFile file = decl.getContainingFile(); if (file != null) { FileObject fo = file.getFileObject(); FSPath fsPath = FSPath.toFSPath(fo); CsmFile[] findFiles = CsmModelAccessor.getModel().findFiles(fsPath, false, false); Collection<CsmObject> out = new HashSet<CsmObject>(findFiles.length); out.add(csmObject); CsmSelect.CsmFilter filter = CsmSelect.getFilterBuilder().createOffsetFilter(decl.getStartOffset()+1); for (CsmFile csmFile : findFiles) { if (!file.equals(csmFile)) { Iterator<CsmOffsetableDeclaration> declarations = CsmSelect.getDeclarations(csmFile, filter); while (declarations.hasNext()) { CsmOffsetableDeclaration other = declarations.next(); if (CsmReferenceSupport.sameDeclaration(other, decl)) { out.add(other); } } } } return out; } } return Collections.singleton(csmObject); } }
private CsmClass visitDeclarations(Collection<CsmOffsetableDeclaration> decls, final int caretOffset) { for(CsmOffsetableDeclaration decl : decls) { if (CsmKindUtilities.isNamespaceDefinition(decl)) { if (decl.getStartOffset() <= caretOffset && caretOffset <= decl.getEndOffset()) { return visitDeclarations(((CsmNamespaceDefinition)decl).getDeclarations(), caretOffset); if (decl.getStartOffset() <= caretOffset && caretOffset <= decl.getEndOffset()) { CsmClass cls = (CsmClass) decl; int leftBracketOffset = cls.getLeftBracketOffset(); if (decl.getStartOffset() <= caretOffset && caretOffset <= decl.getEndOffset()) { return null;
private boolean findFunction(CharSequence name, Iterator<CsmOffsetableDeclaration> it, int offset, CsmFilter filter) { while(it.hasNext()) { CsmOffsetableDeclaration decl = it.next(); if (decl.getStartOffset() >= offset) { break;
private boolean findVariable(CharSequence name, Iterator<CsmOffsetableDeclaration> it, int offset, CsmFilter filter) { while(it.hasNext()) { CsmOffsetableDeclaration decl = it.next(); if (decl.getStartOffset() >= offset) { break; } switch (decl.getKind()) { case VARIABLE: if (CharSequences.comparator().compare(name, ((CsmVariable) decl).getName()) == 0) { return true; } break; case VARIABLE_DEFINITION: if (CharSequences.comparator().compare(name, ((CsmVariable) decl).getQualifiedName()) == 0) { return true; } break; case NAMESPACE_DEFINITION: CsmNamespaceDefinition nd = (CsmNamespaceDefinition) decl; if (nd.getStartOffset() <= offset && nd.getEndOffset() >= offset) { if (findVariable(name, CsmSelect.getDeclarations(nd, filter), offset, filter)) { return true; } } break; } } return false; }
private void visitDeclarations(Set<CsmClass> classes, Collection<CsmOffsetableDeclaration> decls, final int caretOffset) { for(CsmOffsetableDeclaration decl : decls) { if (!isApplicable) { return; } if (CsmKindUtilities.isNamespaceDefinition(decl)) { if (decl.getStartOffset() <= caretOffset && caretOffset <= decl.getEndOffset()) { visitDeclarations(classes, ((CsmNamespaceDefinition)decl).getDeclarations(), caretOffset); } } else { if (decl.getStartOffset() <= caretOffset && caretOffset <= decl.getEndOffset()) { isApplicable = false; } if (CsmKindUtilities.isMethodDefinition(decl)) { CsmFunction declaration = ((CsmFunctionDefinition)decl).getDeclaration(); if (CsmKindUtilities.isFunctionDeclaration(declaration) && CsmKindUtilities.isClassMember(declaration)) { CsmMember method = (CsmMember) declaration; CsmClass cls = method.getContainingClass(); if (cls != null) { classes.add(cls); } } } } } }
private static void addDeclarationAndNested(Collection<FileElement> toAdd, CsmOffsetableDeclaration outDecl) { // TODO: what about function return value? // TODO: what about function params? // TODO: what about const/virtual attributes? // TODO: what about static? CharAndCharSequence cs = new CharAndCharSequence(outDecl.getQualifiedName(), Utils.getCsmDeclarationKindkey(outDecl.getKind())); FileElement fe = new FileElement(outDecl.getStartOffset(), cs); toAdd.add(fe); Iterator<? extends CsmOffsetableDeclaration> it = null; if (CsmKindUtilities.isNamespaceDefinition(outDecl)) { it = ((CsmNamespaceDefinition) outDecl).getDeclarations().iterator(); } else if (CsmKindUtilities.isClass(outDecl)) { CsmClass cl = (CsmClass) outDecl; it = cl.getMembers().iterator(); for (CsmInheritance inh : cl.getBaseClasses()) { CharAndCharSequence csi = new CharAndCharSequence(inh.getAncestorType().getClassifierText(), Utils.getCsmInheritanceKindKey(inh)); toAdd.add(new FileElement(inh.getStartOffset(), csi)); } } else if (CsmKindUtilities.isEnum(outDecl)) { CsmEnum en = (CsmEnum) outDecl; it = en.getEnumerators().iterator(); } if (it != null) { while (it.hasNext()) { CsmOffsetableDeclaration decl = (CsmOffsetableDeclaration) it.next(); addDeclarationAndNested(toAdd, decl); } } }
private StatementResult findExpressionStatement(Collection<? extends CsmOffsetableDeclaration> decls, int selectionStart, int selectionEnd, Document doc, final AtomicBoolean canceled) { for(CsmOffsetableDeclaration decl : decls) { if (canceled.get()) { return null; } if (decl.getStartOffset() < selectionStart && selectionEnd < decl.getEndOffset()) { if (CsmKindUtilities.isFunctionDefinition(decl)) { CsmFunctionDefinition def = (CsmFunctionDefinition) decl; return findExpressionStatementInBody(def.getBody(), selectionStart, selectionEnd, doc, canceled); } else if (CsmKindUtilities.isNamespaceDefinition(decl)) { CsmNamespaceDefinition def = (CsmNamespaceDefinition) decl; return findExpressionStatement(def.getDeclarations(), selectionStart, selectionEnd, doc, canceled); } else if (CsmKindUtilities.isClass(decl)) { CsmClass cls = (CsmClass) decl; return findExpressionStatement(cls.getMembers(), selectionStart, selectionEnd, doc, canceled); } } } return null; }
CsmNamespaceDefinition ns = (CsmNamespaceDefinition) parent; for(CsmOffsetableDeclaration decl : ns.getDeclarations()) { if (decl.getStartOffset() < position && position < decl.getEndOffset()) { list.add(decl); getInternalDeclaration(list, decl, position);
for (CsmInclude include : fileContent.getIncludes()) { if (include instanceof IncludeImpl) { if (include.getStartOffset() > inclContainer.getStartOffset() && include.getEndOffset() < inclContainer.getEndOffset()) {
TypeImpl typeImpl = TypeFactory.createType((CsmClassifier)declaration, ptrOperator, arrayDepth, curr.getFirstChild(), file, declaration.getStartOffset(), declaration.getEndOffset()); typeImpl.setTypeOfTypedef(); List<CsmTemplateParameter> csmTemplateParams = renderTemplateParams(templateParams, scope);