Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
None
Description
VariableScopeVisitor.findClassMember creates PropertyNode instances for methods (ex: foo.bar will have a property node created if getBar() is implemented). This is done inside the MethodNode for loop circa line 165.
The nodes created by this visitor lack a declaring class setting as well as having an improper type. Without these values, type inferencing is more difficult for anyone that processes the AST. These are reasonable simple to remedy:
private Variable findClassMember(ClassNode cn, String name) { if (cn == null) return null; if (cn.isScript()) { return new DynamicVariable(name, false); } for (FieldNode fn : cn.getFields()) { if (fn.getName().equals(name)) return fn; } for (MethodNode mn : cn.getMethods()) { String pName = getPropertyName(mn); // GRECLIPSE edit //if (pName != null && pName.equals(name)) // return new PropertyNode(pName, mn.getModifiers(), ClassHelper.OBJECT_TYPE, cn, null, null, null); if (pName != null && pName.equals(name)) { PropertyNode property = new PropertyNode(pName, mn.getModifiers(), getPropertyType(mn), cn, null, null, null); property.getField().setDeclaringClass(cn); property.setDeclaringClass(cn); return property; } // GRECLIPSE end } ... // GRECLIPSE add private ClassNode getPropertyType(MethodNode m) { if (m.getReturnType() != ClassHelper.VOID_TYPE) { return m.getReturnType(); } return m.getParameters()[0].getType(); } // GRECLIPSE end