@Override public Void visitTypeAlias(TypeAlias node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); TypeAliasElementImpl element = new TypeAliasElementImpl(node.getName()); if (holder.getParameters() != null) { element.setParameters(holder.getParameters()); } element.setTypeVariables(holder.getTypeVariables()); currentHolder.addTypeAlias(element); return null; }
@Override public Void visitFunctionExpression(FunctionExpression node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); FunctionElementImpl element = new FunctionElementImpl(node.getName()); element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getVariables()); if (holder.getParameters() != null) { element.setParameters(holder.getParameters()); } currentHolder.addFunction(element); return null; }
@Override public Void visitNamedFormalParameter(NamedFormalParameter node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node.getDefaultValue()); FunctionElementImpl initializer = new FunctionElementImpl(); initializer.setFunctions(holder.getFunctions()); initializer.setLabels(holder.getLabels()); initializer.setLocalVariables(holder.getVariables()); if (holder.getParameters() != null) { initializer.setParameters(holder.getParameters()); } VariableElementImpl parameter = new VariableElementImpl(node.getParameter().getIdentifier()); parameter.setInitializer(initializer); currentHolder.addVariable(parameter); return null; }
@Override public Void visitMethodDeclaration(MethodDeclaration node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); Token property = node.getPropertyKeyword(); if (property == null) { MethodElementImpl element = new MethodElementImpl(node.getName()); Token keyword = node.getModifierKeyword(); element.setAbstract(matches(keyword, Keyword.ABSTRACT)); element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getVariables()); if (holder.getParameters() != null) { element.setParameters(holder.getParameters()); } element.setStatic(matches(keyword, Keyword.STATIC)); currentHolder.addMethod(element); } else { Identifier propertyNameNode = node.getName(); String propertyName = propertyNameNode.getName(); FieldElementImpl field = (FieldElementImpl) currentHolder.getField(propertyName); if (field == null) { field = new FieldElementImpl(node.getName().getName()); field.setFinal(true); field.setStatic(matches(node.getModifierKeyword(), Keyword.STATIC)); currentHolder.addField(field); } if (matches(property, Keyword.GET)) { PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(propertyNameNode); getter.setField(field); getter.setGetter(true); field.setGetter(getter); } else { PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(propertyNameNode); setter.setField(field); setter.setSetter(true); field.setSetter(setter); field.setFinal(false); } } return null; }
@Override public Void visitConstructorDeclaration(ConstructorDeclaration node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); ConstructorElementImpl element = new ConstructorElementImpl(node.getName()); Token keyword = node.getKeyword(); if (keyword instanceof KeywordToken && ((KeywordToken) keyword).getKeyword() == Keyword.FACTORY) { element.setFactory(true); } element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getVariables()); if (holder.getParameters() != null) { element.setParameters(holder.getParameters()); } currentHolder.addConstructor(element); return null; }
public void test_visitFormalParameterList() { ElementHolder holder = new ElementHolder(); ElementBuilder builder = new ElementBuilder(holder); String firstParameterName = "a"; String secondParameterName = "b"; FormalParameterList parameterList = formalParameterList( simpleFormalParameter(firstParameterName), simpleFormalParameter(secondParameterName)); parameterList.accept(builder); ParameterElement[] parameters = holder.getParameters(); assertLength(2, parameters); assertEquals(firstParameterName, parameters[0].getName()); assertEquals(secondParameterName, parameters[1].getName()); }
@Override public Void visitFunctionExpression(FunctionExpression node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); SimpleIdentifier functionName = null; FunctionElementImpl element = new FunctionElementImpl(functionName); element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getVariables()); element.setParameters(holder.getParameters()); currentHolder.addFunction(element); node.setElement(element); return null; }
public void test_visitSimpleFormalParameter() { ElementHolder holder = new ElementHolder(); ElementBuilder builder = new ElementBuilder(holder); String parameterName = "p"; SimpleFormalParameter formalParameter = simpleFormalParameter(parameterName); formalParameter.accept(builder); ParameterElement[] parameters = holder.getParameters(); assertLength(1, parameters); ParameterElement parameter = parameters[0]; assertNotNull(parameter); assertEquals(parameterName, parameter.getName()); assertNull(parameter.getInitializer()); assertFalse(parameter.isConst()); assertFalse(parameter.isFinal()); assertFalse(parameter.isSynthetic()); assertEquals(ParameterKind.REQUIRED, parameter.getParameterKind()); }
@Override public Void visitFunctionTypeAlias(FunctionTypeAlias node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); SimpleIdentifier aliasName = node.getName(); ParameterElement[] parameters = holder.getParameters(); TypeAliasElementImpl element = new TypeAliasElementImpl(aliasName); element.setParameters(parameters); element.setTypeVariables(holder.getTypeVariables()); ArrayList<Type> normalParameterTypes = new ArrayList<Type>(); ArrayList<Type> optionalParameterTypes = new ArrayList<Type>(); LinkedHashMap<String, Type> namedParameterTypes = new LinkedHashMap<String, Type>(); for (ParameterElement parameter : parameters) { switch (parameter.getParameterKind()) { case REQUIRED: normalParameterTypes.add(parameter.getType()); break; case POSITIONAL: optionalParameterTypes.add(parameter.getType()); break; case NAMED: namedParameterTypes.put(parameter.getName(), parameter.getType()); break; } } TypeName returnType = node.getReturnType(); FunctionTypeImpl functionType = new FunctionTypeImpl(element); functionType.setNormalParameterTypes( normalParameterTypes.toArray(new Type[normalParameterTypes.size()])); functionType.setOptionalParameterTypes( optionalParameterTypes.toArray(new Type[optionalParameterTypes.size()])); functionType.setNamedParameterTypes(namedParameterTypes); if (returnType != null) { functionType.setReturnType(returnType.getType()); } element.setType(functionType); currentHolder.addTypeAlias(element); aliasName.setElement(element); return null; }
@Override public Void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { if (!(node.getParent() instanceof DefaultFormalParameter)) { SimpleIdentifier parameterName = node.getIdentifier(); ParameterElementImpl parameter = new ParameterElementImpl(parameterName); parameter.setParameterKind(node.getKind()); setParameterVisibleRange(node, parameter); currentHolder.addParameter(parameter); parameterName.setStaticElement(parameter); } // // The children of this parameter include any parameters defined on the type of this parameter. // ElementHolder holder = new ElementHolder(); visitChildren(holder, node); ((ParameterElementImpl) node.getElement()).setParameters(holder.getParameters()); holder.validate(); return null; }
@Override public Void visitDefaultFormalParameter(DefaultFormalParameter node) { ElementHolder holder = new ElementHolder(); SimpleIdentifier parameterName = node.getParameter().getIdentifier(); ParameterElementImpl parameter; if (node.getParameter() instanceof FieldFormalParameter) { parameter = new DefaultFieldFormalParameterElementImpl(parameterName); } else { parameter = new DefaultParameterElementImpl(parameterName); } parameter.setConst(node.isConst()); parameter.setFinal(node.isFinal()); parameter.setParameterKind(node.getKind()); // set initializer, default value range Expression defaultValue = node.getDefaultValue(); if (defaultValue != null) { visit(holder, defaultValue); FunctionElementImpl initializer = new FunctionElementImpl(defaultValue.getBeginToken().getOffset()); initializer.setFunctions(holder.getFunctions()); initializer.setLabels(holder.getLabels()); initializer.setLocalVariables(holder.getLocalVariables()); initializer.setParameters(holder.getParameters()); initializer.setSynthetic(true); parameter.setInitializer(initializer); parameter.setDefaultValueRange(defaultValue.getOffset(), defaultValue.getLength()); } // visible range setParameterVisibleRange(node, parameter); currentHolder.addParameter(parameter); parameterName.setStaticElement(parameter); node.getParameter().accept(this); holder.validate(); return null; }
public void test_visitNamedFormalParameter() { ElementHolder holder = new ElementHolder(); ElementBuilder builder = new ElementBuilder(holder); String parameterName = "p"; DefaultFormalParameter formalParameter = namedFormalParameter(simpleFormalParameter(parameterName), identifier("b")); formalParameter.accept(builder); ParameterElement[] parameters = holder.getParameters(); assertLength(1, parameters); ParameterElement parameter = parameters[0]; assertNotNull(parameter); assertEquals(parameterName, parameter.getName()); assertFalse(parameter.isConst()); assertFalse(parameter.isFinal()); assertFalse(parameter.isSynthetic()); assertEquals(ParameterKind.NAMED, parameter.getParameterKind()); FunctionElement initializer = parameter.getInitializer(); assertNotNull(initializer); assertTrue(initializer.isSynthetic()); }
@Override public Void visitFunctionTypeAlias(FunctionTypeAlias node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); SimpleIdentifier aliasName = node.getName(); ParameterElement[] parameters = holder.getParameters(); TypeParameterElement[] typeParameters = holder.getTypeParameters(); FunctionTypeAliasElementImpl element = new FunctionTypeAliasElementImpl(aliasName); element.setParameters(parameters); element.setTypeParameters(typeParameters); FunctionTypeImpl type = new FunctionTypeImpl(element); type.setTypeArguments(createTypeParameterTypes(typeParameters)); element.setType(type); currentHolder.addTypeAlias(element); aliasName.setStaticElement(element); holder.validate(); return null; }
@Override public Void visitDefaultFormalParameter(DefaultFormalParameter node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node.getDefaultValue()); FunctionElementImpl initializer = new FunctionElementImpl(); initializer.setFunctions(holder.getFunctions()); initializer.setLabels(holder.getLabels()); initializer.setLocalVariables(holder.getVariables()); initializer.setParameters(holder.getParameters()); SimpleIdentifier parameterName = node.getParameter().getIdentifier(); ParameterElementImpl parameter = new ParameterElementImpl(parameterName); parameter.setConst(node.isConst()); parameter.setFinal(node.isFinal()); parameter.setInitializer(initializer); parameter.setParameterKind(node.getKind()); currentHolder.addParameter(parameter); parameterName.setElement(parameter); return null; }
@Override public Void visitConstructorDeclaration(ConstructorDeclaration node) { ElementHolder holder = new ElementHolder(); visitChildren(holder, node); SimpleIdentifier constructorName = node.getName(); ConstructorElementImpl element = new ConstructorElementImpl(constructorName); if (node.getFactoryKeyword() != null) { element.setFactory(true); } element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getVariables()); element.setParameters(holder.getParameters()); currentHolder.addConstructor(element); node.setElement(element); if (constructorName != null) { constructorName.setElement(element); } return null; }
@Override public Void visitConstructorDeclaration(ConstructorDeclaration node) { isValidMixin = false; ElementHolder holder = new ElementHolder(); boolean wasInFunction = inFunction; inFunction = true; try { visitChildren(holder, node); } finally { inFunction = wasInFunction; } SimpleIdentifier constructorName = node.getName(); ConstructorElementImpl element = new ConstructorElementImpl(constructorName); if (node.getFactoryKeyword() != null) { element.setFactory(true); } element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getLocalVariables()); element.setParameters(holder.getParameters()); element.setConst(node.getConstKeyword() != null); currentHolder.addConstructor(element); node.setElement(element); if (constructorName == null) { Identifier returnType = node.getReturnType(); if (returnType != null) { element.setNameOffset(returnType.getOffset()); } } else { constructorName.setStaticElement(element); } holder.validate(); return null; }
@Override public Void visitFunctionExpression(FunctionExpression node) { ElementHolder holder = new ElementHolder(); boolean wasInFunction = inFunction; inFunction = true; try { visitChildren(holder, node); } finally { inFunction = wasInFunction; } FunctionElementImpl element = new FunctionElementImpl(node.getBeginToken().getOffset()); element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getLocalVariables()); element.setParameters(holder.getParameters()); if (inFunction) { Block enclosingBlock = node.getAncestor(Block.class); if (enclosingBlock != null) { int functionEnd = node.getOffset() + node.getLength(); int blockEnd = enclosingBlock.getOffset() + enclosingBlock.getLength(); element.setVisibleRange(functionEnd, blockEnd - functionEnd - 1); } } FunctionTypeImpl type = new FunctionTypeImpl(element); if (functionTypesToFix != null) { functionTypesToFix.add(type); } element.setType(type); currentHolder.addFunction(element); node.setElement(element); holder.validate(); return null; }
@Override public Void visitMethodDeclaration(MethodDeclaration node) { ElementHolder holder = new ElementHolder(); boolean wasInFunction = inFunction; inFunction = true; try { visitChildren(holder, node); } finally { inFunction = wasInFunction; } boolean isStatic = node.isStatic(); Token property = node.getPropertyKeyword(); if (property == null) { SimpleIdentifier methodName = node.getName(); String nameOfMethod = methodName.getName(); if (nameOfMethod.equals(TokenType.MINUS.getLexeme()) && node.getParameters().getParameters().size() == 0) { nameOfMethod = "unary-"; } MethodElementImpl element = new MethodElementImpl(nameOfMethod, methodName.getOffset()); element.setAbstract(node.isAbstract()); element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getLocalVariables()); element.setParameters(holder.getParameters()); element.setStatic(isStatic); currentHolder.addMethod(element); methodName.setStaticElement(element); } else { SimpleIdentifier propertyNameNode = node.getName(); String propertyName = propertyNameNode.getName(); FieldElementImpl field = (FieldElementImpl) currentHolder.getField(propertyName); if (field == null) { field = new FieldElementImpl(node.getName().getName()); field.setFinal(true); field.setStatic(isStatic); field.setSynthetic(true); currentHolder.addField(field); } if (matches(property, Keyword.GET)) { PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(propertyNameNode); getter.setFunctions(holder.getFunctions()); getter.setLabels(holder.getLabels()); getter.setLocalVariables(holder.getLocalVariables()); getter.setVariable(field); getter.setAbstract( node.getBody() instanceof EmptyFunctionBody && node.getExternalKeyword() == null); getter.setGetter(true); getter.setStatic(isStatic); field.setGetter(getter); currentHolder.addAccessor(getter); propertyNameNode.setStaticElement(getter); } else { PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(propertyNameNode); setter.setFunctions(holder.getFunctions()); setter.setLabels(holder.getLabels()); setter.setLocalVariables(holder.getLocalVariables()); setter.setParameters(holder.getParameters()); setter.setVariable(field); setter.setAbstract( node.getBody() instanceof EmptyFunctionBody && !matches(node.getExternalKeyword(), Keyword.EXTERNAL)); setter.setSetter(true); setter.setStatic(isStatic); field.setSetter(setter); field.setFinal(false); currentHolder.addAccessor(setter); propertyNameNode.setStaticElement(setter); } } holder.validate(); return null; }
@Override public Void visitFunctionDeclaration(FunctionDeclaration node) { FunctionExpression expression = node.getFunctionExpression(); if (expression != null) { ElementHolder holder = new ElementHolder(); boolean wasInFunction = inFunction; inFunction = true; try { visitChildren(holder, expression); } finally { inFunction = wasInFunction; } Token property = node.getPropertyKeyword(); if (property == null) { SimpleIdentifier functionName = node.getName(); FunctionElementImpl element = new FunctionElementImpl(functionName); element.setFunctions(holder.getFunctions()); element.setLabels(holder.getLabels()); element.setLocalVariables(holder.getLocalVariables()); element.setParameters(holder.getParameters()); if (inFunction) { Block enclosingBlock = node.getAncestor(Block.class); if (enclosingBlock != null) { int functionEnd = node.getOffset() + node.getLength(); int blockEnd = enclosingBlock.getOffset() + enclosingBlock.getLength(); element.setVisibleRange(functionEnd, blockEnd - functionEnd - 1); } } currentHolder.addFunction(element); expression.setElement(element); functionName.setStaticElement(element); } else { SimpleIdentifier propertyNameNode = node.getName(); if (propertyNameNode == null) { // TODO(brianwilkerson) Report this internal error. return null; } String propertyName = propertyNameNode.getName(); TopLevelVariableElementImpl variable = (TopLevelVariableElementImpl) currentHolder.getTopLevelVariable(propertyName); if (variable == null) { variable = new TopLevelVariableElementImpl(node.getName().getName()); variable.setFinal(true); variable.setSynthetic(true); currentHolder.addTopLevelVariable(variable); } if (matches(property, Keyword.GET)) { PropertyAccessorElementImpl getter = new PropertyAccessorElementImpl(propertyNameNode); getter.setFunctions(holder.getFunctions()); getter.setLabels(holder.getLabels()); getter.setLocalVariables(holder.getLocalVariables()); getter.setVariable(variable); getter.setGetter(true); getter.setStatic(true); variable.setGetter(getter); currentHolder.addAccessor(getter); expression.setElement(getter); propertyNameNode.setStaticElement(getter); } else { PropertyAccessorElementImpl setter = new PropertyAccessorElementImpl(propertyNameNode); setter.setFunctions(holder.getFunctions()); setter.setLabels(holder.getLabels()); setter.setLocalVariables(holder.getLocalVariables()); setter.setParameters(holder.getParameters()); setter.setVariable(variable); setter.setSetter(true); setter.setStatic(true); variable.setSetter(setter); variable.setFinal(false); currentHolder.addAccessor(setter); expression.setElement(setter); propertyNameNode.setStaticElement(setter); } } holder.validate(); } return null; }