/* * This file is part of the X10 project (http://x10-lang.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.opensource.org/licenses/eclipse-1.0.php * * (C) Copyright IBM Corporation 2006-2010. */ package x10.dom; import java.util.Iterator; import java.util.List; import org.w3c.dom.Element; import x10.dom.X10Dom.ConstructorInstanceRefLens; import x10.dom.X10Dom.FieldInstanceRefLens; import x10.dom.X10Dom.ListLens; import x10.dom.X10Dom.MethodInstanceRefLens; import x10.dom.X10Dom.TypeRefLens; import x10.types.X10ParsedClassType; import x10.types.X10TypeSystem; import polyglot.types.ConstructorInstance; import polyglot.types.DeserializedClassInitializer; import polyglot.types.FieldInstance; import polyglot.types.LazyClassInitializer; import polyglot.types.MethodInstance; import polyglot.types.ParsedClassType; import polyglot.types.Type; import polyglot.util.Position; public class X10MLClassInitializer implements LazyClassInitializer { X10TypeSystem ts; X10ParsedClassType ct; X10Dom dom; DomReader v; Element e; public X10MLClassInitializer(X10TypeSystem ts, X10Dom dom, DomReader v, Element e) { this.ts = ts; this.dom = dom; this.v = v; this.e = e; } public void setClass(ParsedClassType ct) { this.ct = (X10ParsedClassType) ct; } public boolean fromClassFile() { return false; } public void initTypeObject() { if (ct.isMember() && ct.outer() instanceof ParsedClassType) { ParsedClassType outer = (ParsedClassType) ct.outer(); outer.addMemberClass(ct); } for (Iterator i = ct.memberClasses().iterator(); i.hasNext(); ) { ParsedClassType ct = (ParsedClassType) i.next(); ct.initializer().initTypeObject(); } this.init = true; } public boolean isTypeObjectInitialized() { return this.init; } protected boolean init; protected boolean constructorsInitialized; protected boolean fieldsInitialized; protected boolean interfacesInitialized; protected boolean memberClassesInitialized; protected boolean methodsInitialized; protected boolean superclassInitialized; public void initSuperclass() { if (superclassInitialized) { return; } Type superclass = dom.get(dom.new TypeRefLens(), e, "superclass", v); ct.superType(superclass); superclassInitialized = true; if (superclassInitialized && interfacesInitialized) { ct.setSupertypesResolved(true); } if (initialized()) { v = null; e = null; dom = null; } } public void initInterfaces() { if (interfacesInitialized) { return; } List<Type> interfaces = dom.get(dom.new ListLens<Type>(dom.new TypeRefLens()), e, "interfaces", v); ct.setInterfaces(interfaces); interfacesInitialized = true; if (superclassInitialized && interfacesInitialized) { ct.setSupertypesResolved(true); } if (initialized()) { v = null; e = null; dom = null; } } public void initMemberClasses() { if (memberClassesInitialized) { return; } List memberClasses = dom.get(dom.new ListLens<Type>(dom.new TypeRefLens()), e, "memberClasses", v); ct.setMemberClasses(memberClasses); memberClassesInitialized = true; if (initialized()) { v = null; e = null; dom = null; } } public void canonicalFields() { initFields(); } public void canonicalMethods() { initMethods(); } public void canonicalConstructors() { initConstructors(); } public void initFields() { if (fieldsInitialized) { return; } List<FieldInstance> fields = dom.get(dom.new ListLens<FieldInstance>(dom.new FieldInstanceRefLens()), e, "fields", v); ct.setFields(fields); fieldsInitialized = true; if (initialized()) { v = null; e = null; dom = null; } } public void initMethods() { if (methodsInitialized) { return; } List<MethodInstance> methods = dom.get(dom.new ListLens<MethodInstance>(dom.new MethodInstanceRefLens()), e, "methods", v); ct.setMethods(methods); methodsInitialized = true; if (initialized()) { v = null; e = null; dom = null; } } public void initConstructors() { if (constructorsInitialized) { return; } List<ConstructorInstance> constructors = dom.get(dom.new ListLens<ConstructorInstance>(dom.new ConstructorInstanceRefLens()), e, "constructors", v); ct.setConstructors(constructors); constructorsInitialized = true; if (initialized()) { v = null; e = null; dom = null; } } protected boolean initialized() { return superclassInitialized && interfacesInitialized && memberClassesInitialized && methodsInitialized && fieldsInitialized && constructorsInitialized; } }