visitChildren(holder, expression);
} finally {
inFunction = wasInFunction;
}
FunctionBody body = expression.getBody();
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 (body.isAsynchronous()) {
element.setAsynchronous(true);
}
if (body.isGenerator()) {
element.setGenerator(true);
}
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(), -1);
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());
if (body.isAsynchronous()) {
getter.setAsynchronous(true);
}
if (body.isGenerator()) {
getter.setGenerator(true);
}
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());
if (body.isAsynchronous()) {
setter.setAsynchronous(true);
}
if (body.isGenerator()) {
setter.setGenerator(true);
}
setter.setVariable(variable);
setter.setSetter(true);