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    }