001 package org.mesopotamia.lang.java; 002 003 import java.util.Iterator; 004 import java.util.List; 005 006 import org.mesopotamia.MesopotamiaException; 007 import org.mesopotamia.NodeData; 008 import org.mesopotamia.RepositoryLanguage; 009 import org.mesopotamia.Scan; 010 import org.mesopotamia.lang.java.ref.MethodInfo; 011 import org.mesopotamia.lang.java.ref.Reference; 012 import org.w3c.dom.Element; 013 014 import biz.hammurapi.util.CollectionVisitable; 015 import biz.hammurapi.util.Visitor; 016 017 @SuppressWarnings("unchecked") 018 public class ExplicitThisConstructorInvocation extends JavaLanguageElement implements Statement, Reference<MethodInfo> { 019 020 public ExplicitThisConstructorInvocation(NodeData xData, Class<?> context, 021 Scan scan, RepositoryLanguage language, Object environment) throws MesopotamiaException { 022 super(xData, context, scan, language, environment); 023 024 // Select attributes 025 if (language.supportsTokenName("TYPE_ARGUMENTS")) { 026 TypeArguments = select(TypeArgument.class, "TYPE_ARGUMENTS/TYPE_ARGUMENT"); 027 } 028 Arguments = select(Expression.class, "ELIST/*"); 029 030 } 031 032 public void toDom(Element holder) { 033 super.toDom(holder); 034 035 // Serialize attributes 036 setElement(holder, "TypeArguments", TypeArguments); 037 setElement(holder, "Arguments", Arguments); 038 } 039 040 // Attributes 041 private List<TypeArgument> TypeArguments = emptyList; 042 043 private List<Expression> Arguments; 044 045 // Accessors 046 public List<TypeArgument> getTypeArguments() { 047 return TypeArguments; 048 } 049 050 public List<Expression> getArguments() { 051 return Arguments; 052 } 053 054 protected void acceptChildren(Visitor visitor) { 055 super.acceptChildren(visitor); 056 // Visiting non-text attributes 057 new CollectionVisitable(TypeArguments, false).accept(visitor); 058 new CollectionVisitable(Arguments, false).accept(visitor); 059 } 060 061 /** 062 * Returns constructor info. 063 */ 064 public MethodInfo getInfo() { 065 List<Expression> args = getArguments(); 066 String[] argumentTypes = new String[args.size()]; 067 Iterator<Expression> it = args.iterator(); 068 for (int i=0; it.hasNext(); ++i) { 069 argumentTypes[i] = TypeSpecification.toString(it.next().getTypeSpecInfo()); 070 } 071 072 ClassDefinition cd=findParent(ClassDefinition.class); 073 return cd==null ? null : cd.findConstructor(argumentTypes); 074 } 075 }