/* * Copyright 2013 Guidewire Software, Inc. */ package gw.compiler.ij.processors; import gw.lang.parser.IExpression; import gw.lang.parser.IParseTree; import gw.lang.parser.IParsedElement; import gw.lang.parser.expressions.IBeanMethodCallExpression; import gw.lang.parser.expressions.IFieldAccessExpression; import gw.lang.parser.expressions.IMethodCallExpression; import gw.lang.parser.statements.IClassStatement; import gw.lang.parser.statements.IUsesStatement; import gw.lang.reflect.IType; import gw.lang.reflect.gs.IGosuClass; import gw.lang.reflect.java.JavaTypes; import java.util.Set; public class DependencyCollector { public static IDependencyCollector createExpressionProcessor(IExpression expression) { if (expression instanceof IMethodCallExpression) { return new MethodCallDependencyCollector(); } else if (expression instanceof IBeanMethodCallExpression) { return new BeanMethodCallDependencyCollector(); } else if (expression instanceof IFieldAccessExpression) { return new FieldAccessDependencyCollector(); } else { return null; } } public static void collect(IParseTree parseTree, DependencySink sink) { final IParsedElement element = parseTree.getParsedElement(); if (element == null) { return; } if (element instanceof IExpression) { final IExpression expression = (IExpression) element; final IDependencyCollector collector = createExpressionProcessor(expression); if (collector != null) { collector.collect(expression, sink); } final IType type = expression.getType(); if (type != null) { sink.addType(type); } } if (element instanceof IUsesStatement) { UsesStatementsDependencyCollector.collect((IUsesStatement) element, sink); } if (element instanceof IClassStatement) { final IClassStatement classStatement = (IClassStatement) element; IGosuClass gosuClass = classStatement.getGosuClass(); final IType supertype = gosuClass.getSupertype(); if (supertype != null) { Set<? extends IType> types = supertype.getAllTypesInHierarchy(); for (IType type : types) { type = IGosuClass.ProxyUtil.getProxiedType(type); if (!type.equals(JavaTypes.IGOSU_OBJECT())) { sink.addType(type); } } } EnhancedTypeDependencyCollector.collect(classStatement, sink); } for (IParseTree child : parseTree.getChildren()) { collect(child, sink); } } }