/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.parser.statements; import gw.internal.gosu.parser.IGosuAnnotation; import gw.internal.gosu.parser.IGosuClassInternal; import gw.internal.gosu.parser.Statement; import gw.internal.gosu.parser.expressions.ClassDeclaration; import gw.lang.parser.statements.IClassStatement; import gw.lang.parser.statements.ITerminalStatement; import gw.lang.reflect.IFeatureInfo; import gw.lang.reflect.TypeSystem; import gw.lang.reflect.module.IModule; import java.util.List; /** */ public final class ClassStatement extends Statement implements IClassStatement { private IGosuClassInternal _gsClass; private ClassFileStatement _cfs; private ClassDeclaration _classDeclaration; public ClassStatement( IGosuClassInternal gsClass ) { _gsClass = gsClass; if( _gsClass != null && _gsClass.getEnclosingType() == null ) { _cfs = new ClassFileStatement(); } } public ClassFileStatement getClassFileStatement() { //## todo: get outer-most class file stmt? return _cfs; } public Object execute() { // No-Op return Statement.VOID_RETURN_VALUE; } @Override protected ITerminalStatement getLeastSignificantTerminalStatement_internal( boolean[] bAbsolute ) { bAbsolute[0] = false; return null; } @Override public boolean isNoOp() { return true; } @Override public String toString() { return (_gsClass.isInterface() ? "interface " : "class " ) + _gsClass.getName() + "{ ... }"; } public IGosuClassInternal getGosuClass() { return _gsClass; } @Override public void clearParseTreeInformation() { TypeSystem.lock(); try { super.clearParseTreeInformation(); if( _cfs != null ) { _cfs.setLocation( null ); } } finally { TypeSystem.unlock(); } } public IModule getModule() { return _gsClass.getTypeLoader().getModule(); } private IGosuClassInternal getEnclosingClass() { IGosuClassInternal clazz = _gsClass; while( clazz.getEnclosingType() != null ) { clazz = (IGosuClassInternal)clazz.getEnclosingType(); } return clazz; } private IFeatureInfo getFeatureInfoIfAnyThatEnclosesItselfAndItsChildren() { return getGosuClass().getTypeInfo(); } public ClassDeclaration getClassDeclaration() { return _classDeclaration; } public void setClassDeclaration(ClassDeclaration classDeclaration) { _classDeclaration = classDeclaration; } @Override public List<IGosuAnnotation> getAnnotations() { return getGosuClass().getModifierInfo().getAnnotations(); } }