📄 lookupmethod.jrag
字号:
} return map; } public Iterator TypeDecl.localMethodsIterator() { return new Iterator() { private Iterator outer = localMethodsSignatureMap().values().iterator(); private Iterator inner = null; public boolean hasNext() { if((inner == null || !inner.hasNext()) && outer.hasNext()) inner = ((SimpleSet)outer.next()).iterator(); return inner == null ? false : inner.hasNext(); } public Object next() { return inner.next(); } public void remove() { throw new UnsupportedOperationException(); } }; //return localMethodsSignatureMap().values().iterator(); } syn SimpleSet TypeDecl.localMethodsSignature(String signature) { SimpleSet set = (SimpleSet)localMethodsSignatureMap().get(signature); if(set != null) return set; return SimpleSet.emptySet; } // signature -> method declaration syn lazy HashMap TypeDecl.localMethodsSignatureMap() { HashMap map = new HashMap(getNumBodyDecl()); for(int i = 0; i < getNumBodyDecl(); i++) { if(getBodyDecl(i) instanceof MethodDecl) { MethodDecl decl = (MethodDecl)getBodyDecl(i); map.put(decl.signature(), decl); } } return map; } // iterator over all methods in implemented interfaces public Iterator ClassDecl.interfacesMethodsIterator() { return new Iterator() { private Iterator outer = interfacesMethodsSignatureMap().values().iterator(); private Iterator inner = null; public boolean hasNext() { if((inner == null || !inner.hasNext()) && outer.hasNext()) inner = ((SimpleSet)outer.next()).iterator(); return inner == null ? false : inner.hasNext(); } public Object next() { return inner.next(); } public void remove() { throw new UnsupportedOperationException(); } }; } syn SimpleSet ClassDecl.interfacesMethodsSignature(String signature) { SimpleSet set = (SimpleSet)interfacesMethodsSignatureMap().get(signature); if(set != null) return set; return SimpleSet.emptySet; } // signature -> set of method declarations syn lazy HashMap ClassDecl.interfacesMethodsSignatureMap() { HashMap map = new HashMap(); for(Iterator iter = interfacesIterator(); iter.hasNext(); ) { TypeDecl typeDecl = (InterfaceDecl)iter.next(); for(Iterator i2 = typeDecl.methodsIterator(); i2.hasNext(); ) { MethodDecl m = (MethodDecl)i2.next(); putSimpleSetElement(map, m.signature(), m); } } return map; } // iterate over all member methods in this type public Iterator TypeDecl.methodsIterator() { return new Iterator() { private Iterator outer = methodsSignatureMap().values().iterator(); private Iterator inner = null; public boolean hasNext() { if((inner == null || !inner.hasNext()) && outer.hasNext()) inner = ((SimpleSet)outer.next()).iterator(); return inner != null ? inner.hasNext() : false; } public Object next() { return inner.next(); } public void remove() { throw new UnsupportedOperationException(); } }; } syn SimpleSet TypeDecl.methodsSignature(String signature) { SimpleSet set = (SimpleSet)methodsSignatureMap().get(signature); if(set != null) return set; return SimpleSet.emptySet; } // signature -> SimpleSet syn lazy HashMap TypeDecl.methodsSignatureMap() = localMethodsSignatureMap(); eq ClassDecl.methodsSignatureMap() { HashMap map = new HashMap(localMethodsSignatureMap()); if(hasSuperclass()) { for(Iterator iter = superclass().methodsIterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); if(!m.isPrivate() && m.accessibleFrom(this) && !localMethodsSignatureMap().containsKey(m.signature())) putSimpleSetElement(map, m.signature(), m); } } for(Iterator outerIter = interfacesIterator(); outerIter.hasNext(); ) { TypeDecl typeDecl = (TypeDecl)outerIter.next(); for(Iterator iter = typeDecl.methodsIterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); if(!m.isPrivate() && m.accessibleFrom(this) && !localMethodsSignatureMap().containsKey(m.signature())) if(allMethodsAbstract((SimpleSet)map.get(m.signature()))) putSimpleSetElement(map, m.signature(), m); } } return map; } eq InterfaceDecl.methodsSignatureMap() { HashMap map = new HashMap(localMethodsSignatureMap()); for(Iterator outerIter = superinterfacesIterator(); outerIter.hasNext(); ) { TypeDecl typeDecl = (TypeDecl)outerIter.next(); for(Iterator iter = typeDecl.methodsIterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); if(!m.isPrivate() && m.accessibleFrom(this) && !localMethodsSignatureMap().containsKey(m.signature())) putSimpleSetElement(map, m.signature(), m); } } for(Iterator iter = typeObject().methodsIterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); if(m.isPublic() && !map.containsKey(m.signature())) putSimpleSetElement(map, m.signature(), m); } return map; } protected static void ASTNode.putSimpleSetElement(HashMap map, Object key, Object value) { SimpleSet set = (SimpleSet)map.get(key); if(set == null) set = SimpleSet.emptySet; map.put(key, set.add(value)); } protected boolean TypeDecl.allMethodsAbstract(SimpleSet set) { if(set == null) return true; for(Iterator iter = set.iterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); if(!m.isAbstract()) return false; } return true; }}aspect AncestorMethods { // methods with the same signature declared in ancestors // this is used when checking correct overriding, hiding, and implementation of abstract methods syn lazy SimpleSet TypeDecl.ancestorMethods(String signature) = SimpleSet.emptySet; eq ClassDecl.ancestorMethods(String signature) { SimpleSet set = SimpleSet.emptySet; if(hasSuperclass()) { for(Iterator iter = superclass().localMethodsSignature(signature).iterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); if(!m.isPrivate()) set = set.add(m); } } if(set.size() != 1 || ((MethodDecl)set.iterator().next()).isAbstract()) { for(Iterator iter = interfacesMethodsSignature(signature).iterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); set = set.add(m); } } if(!hasSuperclass()) return set; if(set.size() == 1) { MethodDecl m = (MethodDecl)set.iterator().next(); if(!m.isAbstract()) { boolean done = true; for(Iterator iter = superclass().ancestorMethods(signature).iterator(); iter.hasNext(); ) { MethodDecl n = (MethodDecl)iter.next(); if(n.isPrivate() || !n.accessibleFrom(m.hostType())) done = false; } if(done) return set; } } for(Iterator iter = superclass().ancestorMethods(signature).iterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); set = set.add(m); } return set; } eq InterfaceDecl.ancestorMethods(String signature) { SimpleSet set = SimpleSet.emptySet; for(Iterator outerIter = superinterfacesIterator(); outerIter.hasNext(); ) { TypeDecl typeDecl = (TypeDecl)outerIter.next(); for(Iterator iter = typeDecl.methodsSignature(signature).iterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); set = set.add(m); } } if(!superinterfacesIterator().hasNext()) { for(Iterator iter = typeObject().methodsSignature(signature).iterator(); iter.hasNext(); ) { MethodDecl m = (MethodDecl)iter.next(); if(m.isPublic()) set = set.add(m); } } return set; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -