📄 innerclasses.jrag
字号:
); m = methodQualifier.addMemberMethod(m); methodQualifier.addAccessor(this, "method_super", m); return m; } public MethodDecl FieldDeclaration.createAccessor(TypeDecl fieldQualifier) { MethodDecl m = (MethodDecl)fieldQualifier.getAccessor(this, "field_read"); if(m != null) return m; int accessorIndex = fieldQualifier.accessorCounter++; Modifiers modifiers = new Modifiers(new List()); modifiers.addModifier(new Modifier("static")); modifiers.addModifier(new Modifier("synthetic")); modifiers.addModifier(new Modifier("public")); List parameters = new List(); if(!isStatic()) parameters.add(new ParameterDeclaration(fieldQualifier.createQualifiedAccess(), "that")); m = new MethodDecl( modifiers, type().createQualifiedAccess(), "get$" + name() + "$access$" + accessorIndex, parameters, new List(), new Opt( new Block( new List().add( new ReturnStmt(createAccess()) ) ) ) ); m = fieldQualifier.addMemberMethod(m); fieldQualifier.addAccessor(this, "field_read", m); return m; } public MethodDecl FieldDeclaration.createAccessorWrite(TypeDecl fieldQualifier) { MethodDecl m = (MethodDecl)fieldQualifier.getAccessor(this, "field_write"); if(m != null) return m; int accessorIndex = fieldQualifier.accessorCounter++; Modifiers modifiers = new Modifiers(new List()); modifiers.addModifier(new Modifier("static")); modifiers.addModifier(new Modifier("synthetic")); modifiers.addModifier(new Modifier("public")); List parameters = new List(); if(!isStatic()) parameters.add(new ParameterDeclaration(fieldQualifier.createQualifiedAccess(), "that")); parameters.add(new ParameterDeclaration(type().createQualifiedAccess(), "value")); m = new MethodDecl( modifiers, type().createQualifiedAccess(), "set$" + name() + "$access$" + accessorIndex, parameters, new List(), new Opt( new Block( new List().add( new ExprStmt( new AssignSimpleExpr( createAccess(), new VarAccess("value") ) ) ).add( new ReturnStmt( new Opt( new VarAccess("value") ) ) ) ) ) ); m = fieldQualifier.addMemberMethod(m); fieldQualifier.addAccessor(this, "field_write", m); return m; } private Access FieldDeclaration.createAccess() { Access fieldAccess = new VarAccess(name()); return isStatic() ? fieldAccess : new VarAccess("that").qualifiesAccess(fieldAccess); } syn boolean VarAccess.requiresAccessor() { Variable v = decl(); if(!(v instanceof FieldDeclaration)) return false; FieldDeclaration f = (FieldDeclaration)v; if(f.isPrivate() && !hostType().hasField(v.name())) return true; if(f.isProtected() && !f.hostPackage().equals(hostPackage()) && !hostType().hasField(v.name())) return true; return false; } syn boolean TypeDecl.isAnonymousInNonStaticContext() { return isAnonymous() && !((ClassInstanceExpr)getParent().getParent()).unqualifiedScope().inStaticContext() && (!inExplicitConstructorInvocation() || enclosingBodyDecl().hostType().isInnerType()); } syn boolean TypeDecl.needsEnclosing() { if(isAnonymous()) return isAnonymousInNonStaticContext(); else if(isLocalClass()) return !inStaticContext(); else if(isInnerType()) return true; return false; } syn boolean TypeDecl.needsSuperEnclosing() { if(!isAnonymous()) return false; TypeDecl superClass = ((ClassDecl)this).superclass(); if(superClass.isLocalClass()) return !superClass.inStaticContext(); else if(superClass.isInnerType()) return true; if(needsEnclosing() && enclosing() == superEnclosing()) return false; return false; } syn TypeDecl TypeDecl.enclosing() { if(!needsEnclosing()) return null; TypeDecl typeDecl = enclosingType(); if(isAnonymous() && inExplicitConstructorInvocation()) typeDecl = typeDecl.enclosingType(); return typeDecl; } syn TypeDecl TypeDecl.superEnclosing() = null; eq ClassDecl.superEnclosing() = superclass().enclosing(); syn boolean ConstructorDecl.needsEnclosing() = hostType().needsEnclosing(); syn boolean ConstructorDecl.needsSuperEnclosing() = hostType().needsSuperEnclosing(); syn TypeDecl ConstructorDecl.enclosing() = hostType().enclosing(); syn TypeDecl ConstructorDecl.superEnclosing() = hostType().superEnclosing(); // add val$name as fields to the class private boolean TypeDecl.addEnclosingVariables = true; public void TypeDecl.addEnclosingVariables() { if(!addEnclosingVariables) return; addEnclosingVariables = false; for(Iterator iter = enclosingVariables().iterator(); iter.hasNext(); ) { Variable v = (Variable)iter.next(); Modifiers m = new Modifiers(); m.addModifier(new Modifier("public")); m.addModifier(new Modifier("synthetic")); addMemberField(new FieldDeclaration(m, v.type().createQualifiedAccess(), "val$" + v.name(), new Opt())); } } // add val$name as parameters to the constructor protected boolean ConstructorDecl.addEnclosingVariables = true; public void ConstructorDecl.addEnclosingVariables() { if(!addEnclosingVariables) return; addEnclosingVariables = false; hostType().addEnclosingVariables(); for(Iterator iter = hostType().enclosingVariables().iterator(); iter.hasNext(); ) { Variable v = (Variable)iter.next(); getParameterList().add(new ParameterDeclaration(v.type(), "val$" + v.name())); } } // add val$name as arguments to the constructor protected boolean ConstructorAccess.addEnclosingVariables = true; public void ConstructorAccess.addEnclosingVariables() { if(!addEnclosingVariables) return; addEnclosingVariables = false; decl().addEnclosingVariables(); for(Iterator iter = decl().hostType().enclosingVariables().iterator(); iter.hasNext(); ) { Variable v = (Variable)iter.next(); getArgList().add(new VarAccess("val$" + v.name())); } } // add val$name as arguments to the constructor protected boolean ClassInstanceExpr.addEnclosingVariables = true; public void ClassInstanceExpr.addEnclosingVariables() { if(!addEnclosingVariables) return; addEnclosingVariables = false; decl().addEnclosingVariables(); for(Iterator iter = decl().hostType().enclosingVariables().iterator(); iter.hasNext(); ) { Variable v = (Variable)iter.next(); getArgList().add(new VarAccess(v.name())); } } public ConstructorDecl ConstructorDecl.createAccessor() { ConstructorDecl c = (ConstructorDecl)hostType().getAccessor(this, "constructor"); if(c != null) return c; // make sure enclosing varibles are added as parameters prior to building accessor addEnclosingVariables(); Modifiers modifiers = new Modifiers(new List()); modifiers.addModifier(new Modifier("synthetic")); modifiers.addModifier(new Modifier("public")); List parameters = createAccessorParameters(); // add all parameters as arguments except for the dummy parameter List args = new List(); for(int i = 0; i < parameters.getNumChildNoTransform() - 1; i++) args.add(new VarAccess(((ParameterDeclaration)parameters.getChildNoTransform(i)).name())); ConstructorAccess access = new ConstructorAccess("this", args); access.addEnclosingVariables = false; c = new ConstructorDecl( modifiers, name(), parameters, (List)getExceptionList().fullCopy(), new Opt( new ExprStmt( access ) ), new Block( new List().add(new ReturnStmt(new Opt())) ) ); c = hostType().addConstructor(c); c.addEnclosingVariables = false; hostType().addAccessor(this, "constructor", c); return c; } protected List ConstructorDecl.createAccessorParameters() { List parameters = new List(); for (int i=0; i<getNumParameter(); i++) parameters.add(new ParameterDeclaration(getParameter(i).type(), getParameter(i).name())); parameters.add(new ParameterDeclaration(createAnonymousJavaTypeDecl().createBoundAccess(), ("p" + getNumParameter()))); return parameters; } protected TypeDecl ConstructorDecl.createAnonymousJavaTypeDecl() { ClassDecl classDecl = new ClassDecl( new Modifiers(new List().add(new Modifier("synthetic"))), "" + hostType().nextAnonymousIndex(), new Opt(), new List(), new List() ); classDecl = hostType().addMemberClass(classDecl); hostType().addUsedNestedType(classDecl); return classDecl; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -