/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser;
import java.util.List;
import gw.lang.reflect.IType;
import gw.lang.reflect.TypeSystem;
import gw.lang.reflect.IErrorType;
import gw.lang.reflect.INonLoadableType;
import gw.lang.parser.ITypeUsesMap;
import gw.lang.parser.IScriptPartId;
import gw.lang.reflect.gs.ClassType;
import gw.lang.reflect.gs.IGosuClass;
import gw.lang.reflect.gs.ISourceFileHandle;
import gw.lang.reflect.gs.GosuClassTypeLoader;
/**
*/
public class GosuEnhancement extends GosuClass implements IGosuEnhancementInternal
{
transient private IType _enhancedType;
public GosuEnhancement( String strNamespace, String strRelativeName, GosuClassTypeLoader classTypeLoader, ISourceFileHandle sourceFile, ITypeUsesMap typeUsesMap )
{
super( strNamespace, strRelativeName, classTypeLoader, sourceFile, typeUsesMap );
}
public GosuEnhancement( IGosuEnhancementInternal gosuEnhancement, IType[] paramTypes )
{
super( gosuEnhancement, paramTypes );
this._enhancedType = gosuEnhancement.getEnhancedType();
}
@Override
public IGosuEnhancementInternal getParameterizedType( IType... paramTypes )
{
return (IGosuEnhancementInternal)super.getParameterizedType(paramTypes);
}
@Override
protected IGosuEnhancementInternal makeCopy( IType... paramTypes )
{
return (IGosuEnhancementInternal)TypeSystem.getOrCreateTypeReference(
new GosuEnhancement( (IGosuEnhancementInternal)TypeSystem.getOrCreateTypeReference( this ), paramTypes ) );
}
@Override
public IType getSupertype()
{
compileHeaderIfNeeded();
return null;
}
public IType getEnhancedType()
{
compileHeaderIfNeeded();
return _enhancedType;
}
public void setEnhancedType( IType enhancedType )
{
_enhancedType = enhancedType;
}
public void setFoundCorrectHeader()
{
boolean bEnhancement = true;
}
public void validateAncestry(List<IType> visited) {
if (visited.contains(getOrCreateTypeReference())) {
return;
}
visited.add(getOrCreateTypeReference());
isValid();
IType enhancedType = getEnhancedType();
if (enhancedType instanceof IGosuClass) {
((IGosuClass)enhancedType).validateAncestry(visited);
}
}
@Override
public ClassType getClassType() {
return ClassType.Enhancement;
}
}