/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser;
import gw.config.BaseService;
import gw.fs.IDirectory;
import gw.fs.IFile;
import gw.internal.gosu.coercer.FunctionToInterfaceClassGenerator;
import gw.internal.gosu.ir.builders.SimpleCompiler;
import gw.internal.gosu.ir.transform.util.IRTypeResolverAPIWrapper;
import gw.internal.gosu.javadoc.JavaDocFactoryImpl;
import gw.internal.gosu.module.GlobalModule;
import gw.internal.gosu.module.Module;
import gw.internal.gosu.parser.expressions.Identifier;
import gw.internal.gosu.parser.expressions.NullExpression;
import gw.internal.gosu.runtime.GosuRuntimeMethods;
import gw.internal.gosu.template.GosuTemplateType;
import gw.internal.gosu.template.SimpleTemplateHost;
import gw.internal.gosu.template.TemplateGenerator;
import gw.internal.gosu.template.TemplateObserverAccess;
import gw.internal.gosu.template.TemplateTokenizerInstructor;
import gw.lang.IGosuShop;
import gw.lang.annotation.UsageModifier;
import gw.lang.annotation.UsageTarget;
import gw.lang.init.GosuPathEntry;
import gw.lang.init.ModuleFileUtil;
import gw.lang.ir.IRClassCompiler;
import gw.lang.ir.IRTypeResolver;
import gw.lang.javadoc.IJavaDocFactory;
import gw.lang.parser.EvaluationException;
import gw.lang.parser.IConstructorInfoFactory;
import gw.lang.parser.IDynamicFunctionSymbol;
import gw.lang.parser.IExpression;
import gw.lang.parser.IParsedElement;
import gw.lang.parser.IParserPart;
import gw.lang.parser.IReducedDynamicFunctionSymbol;
import gw.lang.parser.IScope;
import gw.lang.parser.ISourceCodeTokenizer;
import gw.lang.parser.IStackProvider;
import gw.lang.parser.ISymbol;
import gw.lang.parser.ISymbolTable;
import gw.lang.parser.ITokenizerInstructor;
import gw.lang.parser.ITypeUsesMap;
import gw.lang.parser.StandardSymbolTable;
import gw.lang.parser.exceptions.ParseException;
import gw.lang.parser.expressions.IIdentifierExpression;
import gw.lang.parser.expressions.INullExpression;
import gw.lang.parser.template.ITemplateHost;
import gw.lang.parser.template.ITemplateObserver;
import gw.lang.parser.template.TemplateParseException;
import gw.lang.reflect.FunctionType;
import gw.lang.reflect.IAnnotationInfo;
import gw.lang.reflect.IAnnotationInfoFactory;
import gw.lang.reflect.IAttributedFeatureInfo;
import gw.lang.reflect.IEntityAccess;
import gw.lang.reflect.IFeatureInfo;
import gw.lang.reflect.IFunctionType;
import gw.lang.reflect.IMetaType;
import gw.lang.reflect.IMethodInfo;
import gw.lang.reflect.IMethodInfoFactory;
import gw.lang.reflect.IPropertyAccessor;
import gw.lang.reflect.IPropertyInfo;
import gw.lang.reflect.IPropertyInfoFactory;
import gw.lang.reflect.IScriptabilityModifier;
import gw.lang.reflect.IType;
import gw.lang.reflect.ITypeInfo;
import gw.lang.reflect.ITypeInfoFactory;
import gw.lang.reflect.ITypeRef;
import gw.lang.reflect.PropertyInfoDelegate;
import gw.lang.reflect.TypeSystem;
import gw.lang.reflect.gs.GosuClassTypeLoader;
import gw.lang.reflect.gs.IEnhancementIndex;
import gw.lang.reflect.gs.IFileSystemGosuClassRepository;
import gw.lang.reflect.gs.IGosuClass;
import gw.lang.reflect.gs.IGosuEnhancement;
import gw.lang.reflect.gs.IGosuProgram;
import gw.lang.reflect.gs.ISourceFileHandle;
import gw.lang.reflect.gs.ITemplateType;
import gw.lang.reflect.java.IJavaClassInfo;
import gw.lang.reflect.module.IClassPath;
import gw.lang.reflect.module.IExecutionEnvironment;
import gw.lang.reflect.module.IModule;
import gw.util.GosuExceptionUtil;
import gw.util.IFeatureFilter;
import java.beans.IntrospectionException;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.Method;
import java.util.List;
/**
*/
public class GosuIndustrialParkImpl extends BaseService implements IGosuShop
{
private IPropertyInfoFactory _propertyInfoFactory = new PropertyInfoFactoryImpl();
private IMethodInfoFactory _methodInfoFactory = new MethodInfoFactoryImpl();
private IAnnotationInfoFactory _annotationInfoFactory = AnnotationInfoFactoryImpl.instance();
private IConstructorInfoFactory _constructorInfoFactory = new ConstructorInfoFactoryImpl();
private IJavaDocFactory _javaDocFactory = new JavaDocFactoryImpl();
private ITypeInfoFactory _typeInfoFactory = new TypeInfoFactoryImpl();
public ISymbolTable createSymbolTable()
{
return new StandardSymbolTable();
}
public ISymbolTable createSymbolTable( boolean bDefineCommonSymbols )
{
return new StandardSymbolTable( bDefineCommonSymbols );
}
public ITemplateHost createTemplateHost()
{
return new SimpleTemplateHost();
}
public IConstructorInfoFactory getConstructorInfoFactory()
{
return _constructorInfoFactory;
}
public IAnnotationInfoFactory getAnnotationInfoFactory()
{
return _annotationInfoFactory;
}
public IPropertyInfo createLengthProperty(ITypeInfo typeInfo)
{
try
{
return new LengthProperty(typeInfo);
}
catch( IntrospectionException e )
{
throw new RuntimeException( e );
}
}
@Override
public INullExpression getNullExpressionInstance() {
return NullExpression.instance();
}
@Override
public GosuExceptionUtil.IForceThrower getForceThrower()
{
return ForceThrowerGenerator.create();
}
public IFunctionType createFunctionType( IMethodInfo mi )
{
return new FunctionType( mi );
}
public ISymbol createSymbol( CharSequence name, IType type, Object value )
{
return new Symbol( name.toString(), type, value );
}
public ISymbol createSymbol( CharSequence name, IType type, IStackProvider stackProvider )
{
return new Symbol( name.toString(), type, stackProvider );
}
public ISymbol createDynamicFunctionSymbol( ISymbolTable symbolTable, String strMemberName, IFunctionType functionType, List<ISymbol> params, IExpression value )
{
return new DynamicFunctionSymbol( symbolTable, strMemberName, functionType, params, value );
}
public IEnhancementIndex createEnhancementIndex( GosuClassTypeLoader loader )
{
return new EnhancementIndex( loader );
}
public IGosuClass createClass( String strNamespace, String strRelativeName, GosuClassTypeLoader loader, ISourceFileHandle sourceFile, ITypeUsesMap typeUsesMap )
{
final ITypeRef ref = TypeSystem.getOrCreateTypeReference(new GosuClass(strNamespace, strRelativeName, loader, sourceFile, typeUsesMap));
return (IGosuClass) ref;
}
public IGosuProgram createProgram( String strNamespace, String strRelativeName, GosuClassTypeLoader loader, ISourceFileHandle sourceFile, ITypeUsesMap typeUsesMap, ISymbolTable symTable )
{
GosuProgram program = new GosuProgram(strNamespace, strRelativeName, loader, sourceFile, typeUsesMap, symTable);
return (IGosuProgram)TypeSystem.getOrCreateTypeReference(program);
}
@Override
public IGosuProgram createProgramForEval( String strNamespace, String strRelativeName, GosuClassTypeLoader loader, ISourceFileHandle sourceFile, ITypeUsesMap typeUsesMap, ISymbolTable symTable )
{
IGosuProgramInternal gosuProgram = (IGosuProgramInternal)createProgram( strNamespace, strRelativeName, loader, sourceFile, typeUsesMap, symTable );
gosuProgram.setAnonymous( true );
return gosuProgram;
}
public IGosuEnhancement createEnhancement( String strNamespace, String strRelativeName, GosuClassTypeLoader loader, ISourceFileHandle sourceFile, ITypeUsesMap typeUsesMap )
{
return (IGosuEnhancement)TypeSystem.getOrCreateTypeReference( new GosuEnhancement( strNamespace, strRelativeName, loader, sourceFile, typeUsesMap ) );
}
public ITemplateType createTemplate( String strNamespace, String strRelativeName, GosuClassTypeLoader loader, ISourceFileHandle sourceFile, ITypeUsesMap typeUsesMap, ISymbolTable symTable )
{
return (ITemplateType)TypeSystem.getOrCreateTypeReference( new GosuTemplateType( strNamespace, strRelativeName, loader, sourceFile, typeUsesMap, symTable ) );
}
public IFileSystemGosuClassRepository createFileSystemGosuClassRepository(IModule module, IDirectory[] files)
{
return createFileSystemGosuClassRepository(module, files, GosuClassTypeLoader.ALL_EXTS);
}
public IFileSystemGosuClassRepository createFileSystemGosuClassRepository(IModule module, IDirectory[] files, String[] extensions)
{
IFileSystemGosuClassRepository repository = new FileSystemGosuClassRepository(module);
repository.setSourcePath(files);
return repository;
}
public ITypeUsesMap createTypeUsesMap( List<String> specialTypeUses )
{
return new TypeUsesMap( specialTypeUses );
}
public IPropertyInfo getPropertyInfo( IType classBean, String strProperty, IFeatureFilter filter, IParserPart parser, IScriptabilityModifier scriptabilityConstraint) throws ParseException
{
return BeanAccess.getPropertyInfo( classBean, strProperty, filter, (ParserBase)parser, scriptabilityConstraint );
}
public List<? extends IPropertyInfo> getProperties( ITypeInfo beanInfo, IType classSource )
{
return BeanAccess.getProperties( beanInfo, classSource );
}
public boolean isDescriptorHidden( IAttributedFeatureInfo pi )
{
return BeanAccess.isDescriptorHidden( pi );
}
public List<? extends IMethodInfo> getMethods( ITypeInfo beanInfo, IType ownersIntrinsicType )
{
return BeanAccess.getMethods( beanInfo, ownersIntrinsicType );
}
public StandardParserState createStandardParserState( IParsedElement rootParsedElement, String scriptSrc, boolean b )
{
return new StandardParserState( rootParsedElement, scriptSrc, b );
}
public EvaluationException createEvaluationException(String msg) {
return new EvaluationException( msg );
}
public IModule createModule( IExecutionEnvironment execEnv, String strMemberName )
{
return new Module( execEnv, strMemberName);
}
@Override
public IGosuClass getGosuClassFrom( IType fromType ) {
return IGosuClassInternal.Util.getGosuClassFrom( fromType );
}
@Override
public IModule createGlobalModule(IExecutionEnvironment execEnv) {
return new GlobalModule( execEnv, IExecutionEnvironment.GLOBAL_MODULE_NAME);
}
@Override
public IClassPath createClassPath(IModule module, boolean includeAllClasses) {
return new ClassPath(module, includeAllClasses ? ClassPath.ALLOW_ALL_FILTER : ClassPath.ONLY_API_CLASSES);
}
@Override
public IType getPureGenericType(IType type) {
return TypeLord.getPureGenericType(type);
}
public IJavaClassInfo createClassInfo(Class aClass, IModule module) {
return new ClassJavaClassInfo(aClass, module);
}
@Override
public IMetaType createMetaType(IType type, boolean literal) {
return new MetaType(type, literal);
}
public IPropertyInfo createPropertyDelegate(IFeatureInfo container, IPropertyInfo prop) {
return new PropertyInfoDelegate(container, prop);
}
public IJavaDocFactory getJavaDocFactory()
{
return _javaDocFactory;
}
public ITypeInfoFactory getTypeInfoFactory()
{
return _typeInfoFactory;
}
public IEntityAccess getDefaultEntityAccess()
{
return DefaultEntityAccess.instance();
}
public ITemplateHost createSimpleTemplateHost()
{
return new SimpleTemplateHost();
}
public ISourceCodeTokenizer createSourceCodeTokenizer( CharSequence code )
{
return new SourceCodeTokenizer( code );
}
public ISourceCodeTokenizer createSourceCodeTokenizer( CharSequence code, boolean bTemplate )
{
SourceCodeTokenizer sourceCodeTokenizer = new SourceCodeTokenizer( code );
if(bTemplate) {
sourceCodeTokenizer.setInstructor(new TemplateTokenizerInstructor(sourceCodeTokenizer));
}
return sourceCodeTokenizer;
}
public ISourceCodeTokenizer createSourceCodeTokenizer( Reader reader )
{
return new SourceCodeTokenizer( reader );
}
public IScope createCommnoSymbolScope()
{
return CommonSymbolsScope.make();
}
public IIdentifierExpression createIdentifierExpression()
{
return new Identifier();
}
public void generateTemplate( Reader readerTemplate, Writer writerOut, ISymbolTable symbolTable ) throws TemplateParseException
{
TemplateGenerator.generateTemplate( readerTemplate, writerOut, symbolTable );
}
@Override
public ITokenizerInstructor createTemplateTokenizerInstructor( ISourceCodeTokenizer tokenizer )
{
return new TemplateTokenizerInstructor( tokenizer );
}
public ISymbolTable getGosuClassSymbolTable()
{
return TypeSystem.getCompiledGosuClassSymbolTable();
}
@Override
public Class getBlockToInterfaceConversionClass(IType typeToCoerceTo) {
return FunctionToInterfaceClassGenerator.getBlockToInterfaceConversionClass( typeToCoerceTo );
}
@Override
public IRTypeResolver getIRTypeResolver() {
return IRTypeResolverAPIWrapper.INSTANCE;
}
@Override
public IRClassCompiler getIRClassCompiler() {
return SimpleCompiler.INSTANCE;
}
@Override
public Object evaluateAnnotation( IAnnotationInfo ai )
{
return CompileTimeAnnotationHandler.eval( ai );
}
@Override
public IPropertyAccessor getLengthAccessor()
{
return LengthAccessor.INSTANCE;
}
@Override
public GosuPathEntry createPathEntryFromModuleFile(IFile f) {
return ModuleFileUtil.createPathEntryForModuleFile(f);
}
@Override
public Method[] getDeclaredMethods( Class cls )
{
return NewIntrospector.getDeclaredMethods( cls );
}
@Override
public boolean isAnnotationAllowedMultipleTimes( IFeatureInfo fi, IAnnotationInfo annotationInfo )
{
return UsageModifier.Many == UsageModifier.getUsageModifier( UsageTarget.getForFeature( fi ), annotationInfo.getType() );
}
@Override
public IReducedDynamicFunctionSymbol createReducedDynamicFunctionSymbol(IDynamicFunctionSymbol symbol) {
return symbol.createReducedSymbol();
}
public byte[] updateReloadClassesIndicator( List<String> changedTypes, String strScript )
{
return ReloadClassesIndicatorCompiler.updateReloadClassesIndicator( changedTypes, strScript );
}
@Override
public ITemplateObserver.ITemplateObserverManager makeTemplateObserverManager() {
return new TemplateObserverAccess();
}
@Override
public void print( Object ret ) {
GosuRuntimeMethods.print( ret );
}
@Override
public String toString( Object val ) {
return GosuRuntimeMethods.toString( val );
}
}