/* * The JastAdd Extensible Java Compiler (http://jastadd.org) is covered * by the modified BSD License. You should have received a copy of the * modified BSD license with this compiler. * * Copyright (c) 2005-2008, Torbjorn Ekman * All rights reserved. */ aspect Variables { interface Variable { public String name(); public TypeDecl type(); // 4.5.3 public boolean isClassVariable(); public boolean isInstanceVariable(); public boolean isMethodParameter(); public boolean isConstructorParameter(); public boolean isExceptionHandlerParameter(); public boolean isLocalVariable(); // 4.5.4 public boolean isFinal(); public boolean isBlank(); public boolean isStatic(); public boolean isSynthetic(); public TypeDecl hostType(); public Expr getInit(); public boolean hasInit(); public Constant constant(); } VariableDeclaration implements Variable; // 4.5.3 syn boolean VariableDeclaration.isClassVariable() = false; syn boolean VariableDeclaration.isInstanceVariable() = false; syn boolean VariableDeclaration.isMethodParameter() = false; syn boolean VariableDeclaration.isConstructorParameter() = false; syn boolean VariableDeclaration.isExceptionHandlerParameter() = false; syn boolean VariableDeclaration.isLocalVariable() = true; // 4.5.4 syn boolean VariableDeclaration.isFinal() = getModifiers().isFinal(); syn boolean VariableDeclaration.isBlank() = !hasInit(); syn boolean VariableDeclaration.isStatic() = false; syn String VariableDeclaration.name() = getID(); syn lazy Constant VariableDeclaration.constant() = type().cast(getInit().constant()); FieldDeclaration implements Variable; // 4.5.3 syn boolean FieldDeclaration.isClassVariable() = isStatic() || hostType().isInterfaceDecl(); syn boolean FieldDeclaration.isInstanceVariable() = (hostType().isClassDecl() || hostType().isAnonymous() )&& !isStatic(); syn boolean FieldDeclaration.isMethodParameter() = false; syn boolean FieldDeclaration.isConstructorParameter() = false; syn boolean FieldDeclaration.isExceptionHandlerParameter() = false; syn boolean FieldDeclaration.isLocalVariable() = false; syn boolean FieldDeclaration.isBlank() = !hasInit(); syn String FieldDeclaration.name() = getID(); syn lazy Constant FieldDeclaration.constant() = type().cast(getInit().constant()); ParameterDeclaration implements Variable; // 4.5.3 syn boolean ParameterDeclaration.isClassVariable() = false; syn boolean ParameterDeclaration.isInstanceVariable() = false; inh boolean ParameterDeclaration.isMethodParameter(); inh boolean ParameterDeclaration.isConstructorParameter(); inh boolean ParameterDeclaration.isExceptionHandlerParameter(); syn boolean ParameterDeclaration.isLocalVariable() = false; // 4.5.3 eq ConstructorDecl.getParameter().isMethodParameter() = false; eq ConstructorDecl.getParameter().isConstructorParameter() = true; eq ConstructorDecl.getParameter().isExceptionHandlerParameter() = false; eq MethodDecl.getParameter().isMethodParameter() = true; eq MethodDecl.getParameter().isConstructorParameter() = false; eq MethodDecl.getParameter().isExceptionHandlerParameter() = false; eq CatchClause.getParameter().isMethodParameter() = false; eq CatchClause.getParameter().isConstructorParameter() = false; eq CatchClause.getParameter().isExceptionHandlerParameter() = true; // 4.5.4 syn boolean ParameterDeclaration.isFinal() = getModifiers().isFinal(); syn boolean ParameterDeclaration.isBlank() = true; syn boolean ParameterDeclaration.isStatic() = false; syn String ParameterDeclaration.name() = getID(); syn boolean ParameterDeclaration.hasInit() = false; syn Expr ParameterDeclaration.getInit() { throw new UnsupportedOperationException(); } syn Constant ParameterDeclaration.constant() { throw new UnsupportedOperationException(); } syn String VariableDecl.name() = getID(); } aspect VariableDeclarationTransformation { // FieldDecl with single VariableDecl -> FieldDeclaration rewrite FieldDecl { when(getNumVariableDecl() == 1) to FieldDeclaration { FieldDeclaration decl = getVariableDecl(0).createFieldDeclarationFrom(getModifiers(), getTypeAccess()); decl.setStart(start); // copy location information decl.setEnd(end); // copy location information return decl; } } // FieldDecl with multiple VariableDecl -> FieldDeclaration+ rewrite FieldDecl in TypeDecl.getBodyDecl() { when(getNumVariableDecl() > 1) to List { List varList = new List(); for(int j = 0; j < getNumVariableDecl(); j++) { FieldDeclaration f = getVariableDecl(j).createFieldDeclarationFrom( (Modifiers)getModifiers().fullCopy(), (Access)getTypeAccess().fullCopy() ); if(j == 0) f.setStart(start); varList.add(f); } return varList; } } // VarDeclStmt with single VariableDecl -> VariableDeclaration rewrite VarDeclStmt { when(getNumVariableDecl() == 1) to VariableDeclaration { VariableDeclaration decl = getVariableDecl(0).createVariableDeclarationFrom(getModifiers(), getTypeAccess()); decl.setStart(start); // copy location information decl.setEnd(end); // copy location information return decl; } } // VarDeclStmt with multiple VariableDecl -> VariableDeclaration+ rewrite VarDeclStmt in Block.getStmt() { when(getNumVariableDecl() > 1) to List createVariableDeclarationList(); } rewrite VarDeclStmt in ForStmt.getInitStmt() { when(getNumVariableDecl() > 1) to List createVariableDeclarationList(); } private List VarDeclStmt.createVariableDeclarationList() { List varList = new List(); for(int j = 0; j < getNumVariableDecl(); j++) { VariableDeclaration v = getVariableDecl(j).createVariableDeclarationFrom( (Modifiers)getModifiers().fullCopy(), (Access)getTypeAccess().fullCopy() ); if(j == 0) v.setStart(start); varList.add(v); } return varList; } public VariableDeclaration VariableDecl.createVariableDeclarationFrom(Modifiers modifiers, Access type) { VariableDeclaration decl = new VariableDeclaration( modifiers, type.addArrayDims(getDimsList()), getID(), getInitOpt() ); decl.setStart(start); // copy location information decl.setEnd(end); // copy location information decl.IDstart = IDstart; decl.IDend = IDend; return decl; } public FieldDeclaration VariableDecl.createFieldDeclarationFrom(Modifiers modifiers, Access type) { FieldDeclaration decl = new FieldDeclaration( modifiers, type.addArrayDims(getDimsList()), getID(), getInitOpt() ); decl.setStart(start); // copy location information decl.setEnd(end); // copy location information decl.IDstart = IDstart; decl.IDend = IDend; return decl; } }