void DeclarationBuilder::visitAliasStatement(Ast *node) { Ast *right = new Ast(node->tree->r, node->context); QualifiedIdentifier id = QualifiedIdentifier(QString(right->tree->name)); const RangeInRevision &range = editorFindRange(right, right); DeclarationPointer decl = getDeclaration(id, range, DUContextPointer(currentContext())); if (is_global_var(node->tree->l) && is_global_var(right->tree)) { DUChainWriteLocker wlock; // If the global variable on the right is not declared, declare it as nil if (!decl) { AbstractType::Ptr type = topContext()->findDeclarations(QualifiedIdentifier("NilClass")).first()->abstractType(); VariableDeclaration *vDecl = openDefinition<VariableDeclaration>(id, range); vDecl->setVariableKind(right->tree); vDecl->setKind(Declaration::Instance); vDecl->setType(type); eventuallyAssignInternalContext(); DeclarationBuilderBase::closeDeclaration(); decl = vDecl; } node->tree = node->tree->l; QualifiedIdentifier aid = getIdentifier(node); AbstractType::Ptr type = decl->abstractType(); declareVariable(aid, type, node); } else if (decl && decl->isFunctionDeclaration()) { DUChainWriteLocker wlock; MethodDeclaration *md = dynamic_cast<MethodDeclaration *>(decl.data()); node->tree = node->tree->l; const RangeInRevision & arange = editorFindRange(node, node); QualifiedIdentifier aid = getIdentifier(node); aliasMethodDeclaration(aid, arange, md); } else appendProblem(node->tree, i18n("undefined method `%1'", id.toString())); }
void DeclarationBuilder::visitExprMax(ExprMaxAst* node) { if (node->var) { SimpleRange range = editorFindRange(node->var, node->var); VariableDeclaration *dec = openDeclaration<VariableDeclaration>(identifierForNode(node->var), range); dec->setKind(Declaration::Instance); eventuallyAssignInternalContext(); closeDeclaration(); } else { DeclarationBuilderBase::visitExprMax(node); } }