aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libsolidity/analysis/NameAndTypeResolver.cpp2
-rw-r--r--libsolidity/ast/AST.h12
-rw-r--r--libsolidity/ast/ASTPrinter.cpp2
-rw-r--r--libsolidity/parsing/Parser.cpp32
-rw-r--r--libsolidity/parsing/Parser.h1
-rw-r--r--test/libsolidity/Imports.cpp2
6 files changed, 27 insertions, 24 deletions
diff --git a/libsolidity/analysis/NameAndTypeResolver.cpp b/libsolidity/analysis/NameAndTypeResolver.cpp
index 92347bfc..96ffdd6e 100644
--- a/libsolidity/analysis/NameAndTypeResolver.cpp
+++ b/libsolidity/analysis/NameAndTypeResolver.cpp
@@ -264,7 +264,7 @@ void NameAndTypeResolver::linearizeBaseContracts(ContractDefinition& _contract)
list<list<ContractDefinition const*>> input(1, {});
for (ASTPointer<InheritanceSpecifier> const& baseSpecifier: _contract.baseContracts())
{
- Identifier const& baseName = baseSpecifier->name();
+ UserDefinedTypeName const& baseName = baseSpecifier->name();
auto base = dynamic_cast<ContractDefinition const*>(baseName.annotation().referencedDeclaration);
if (!base)
reportFatalTypeError(baseName.createTypeError("Contract expected."));
diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h
index 84e9e706..604a12a0 100644
--- a/libsolidity/ast/AST.h
+++ b/libsolidity/ast/AST.h
@@ -340,7 +340,7 @@ class InheritanceSpecifier: public ASTNode
public:
InheritanceSpecifier(
SourceLocation const& _location,
- ASTPointer<Identifier> const& _baseName,
+ ASTPointer<UserDefinedTypeName> const& _baseName,
std::vector<ASTPointer<Expression>> _arguments
):
ASTNode(_location), m_baseName(_baseName), m_arguments(_arguments) {}
@@ -348,11 +348,11 @@ public:
virtual void accept(ASTVisitor& _visitor) override;
virtual void accept(ASTConstVisitor& _visitor) const override;
- Identifier const& name() const { return *m_baseName; }
+ UserDefinedTypeName const& name() const { return *m_baseName; }
std::vector<ASTPointer<Expression>> const& arguments() const { return m_arguments; }
private:
- ASTPointer<Identifier> m_baseName;
+ ASTPointer<UserDefinedTypeName> m_baseName;
std::vector<ASTPointer<Expression>> m_arguments;
};
@@ -366,7 +366,7 @@ class UsingForDirective: public ASTNode
public:
UsingForDirective(
SourceLocation const& _location,
- ASTPointer<Identifier> const& _libraryName,
+ ASTPointer<UserDefinedTypeName> const& _libraryName,
ASTPointer<TypeName> const& _typeName
):
ASTNode(_location), m_libraryName(_libraryName), m_typeName(_typeName) {}
@@ -374,12 +374,12 @@ public:
virtual void accept(ASTVisitor& _visitor) override;
virtual void accept(ASTConstVisitor& _visitor) const override;
- Identifier const& libraryName() const { return *m_libraryName; }
+ UserDefinedTypeName const& libraryName() const { return *m_libraryName; }
/// @returns the type name the library is attached to, null for `*`.
TypeName const* typeName() const { return m_typeName.get(); }
private:
- ASTPointer<Identifier> m_libraryName;
+ ASTPointer<UserDefinedTypeName> m_libraryName;
ASTPointer<TypeName> m_typeName;
};
diff --git a/libsolidity/ast/ASTPrinter.cpp b/libsolidity/ast/ASTPrinter.cpp
index b2ce1c26..d4f13e47 100644
--- a/libsolidity/ast/ASTPrinter.cpp
+++ b/libsolidity/ast/ASTPrinter.cpp
@@ -63,7 +63,7 @@ bool ASTPrinter::visit(ContractDefinition const& _node)
bool ASTPrinter::visit(InheritanceSpecifier const& _node)
{
- writeLine("InheritanceSpecifier \"" + _node.name().name() + "\"");
+ writeLine("InheritanceSpecifier");
printSourcePart(_node);
return goDeeper();
}
diff --git a/libsolidity/parsing/Parser.cpp b/libsolidity/parsing/Parser.cpp
index d53f825f..7dd3564d 100644
--- a/libsolidity/parsing/Parser.cpp
+++ b/libsolidity/parsing/Parser.cpp
@@ -238,7 +238,7 @@ ASTPointer<ContractDefinition> Parser::parseContractDefinition(bool _isLibrary)
ASTPointer<InheritanceSpecifier> Parser::parseInheritanceSpecifier()
{
ASTNodeFactory nodeFactory(*this);
- ASTPointer<Identifier> name(parseIdentifier());
+ ASTPointer<UserDefinedTypeName> name(parseUserDefinedTypeName());
vector<ASTPointer<Expression>> arguments;
if (m_scanner->currentToken() == Token::LParen)
{
@@ -533,8 +533,7 @@ ASTPointer<UsingForDirective> Parser::parseUsingDirective()
ASTNodeFactory nodeFactory(*this);
expectToken(Token::Using);
- //@todo this should actually parse a full path.
- ASTPointer<Identifier> library(parseIdentifier());
+ ASTPointer<UserDefinedTypeName> library(parseUserDefinedTypeName());
ASTPointer<TypeName> typeName;
expectToken(Token::For);
if (m_scanner->currentToken() == Token::Mul)
@@ -570,6 +569,20 @@ ASTPointer<Identifier> Parser::parseIdentifier()
return nodeFactory.createNode<Identifier>(expectIdentifierToken());
}
+ASTPointer<UserDefinedTypeName> Parser::parseUserDefinedTypeName()
+{
+ ASTNodeFactory nodeFactory(*this);
+ nodeFactory.markEndPosition();
+ vector<ASTString> identifierPath{*expectIdentifierToken()};
+ while (m_scanner->currentToken() == Token::Period)
+ {
+ m_scanner->next();
+ nodeFactory.markEndPosition();
+ identifierPath.push_back(*expectIdentifierToken());
+ }
+ return nodeFactory.createNode<UserDefinedTypeName>(identifierPath);
+}
+
ASTPointer<TypeName> Parser::parseTypeName(bool _allowVar)
{
ASTNodeFactory nodeFactory(*this);
@@ -589,18 +602,7 @@ ASTPointer<TypeName> Parser::parseTypeName(bool _allowVar)
else if (token == Token::Mapping)
type = parseMapping();
else if (token == Token::Identifier)
- {
- ASTNodeFactory nodeFactory(*this);
- nodeFactory.markEndPosition();
- vector<ASTString> identifierPath{*expectIdentifierToken()};
- while (m_scanner->currentToken() == Token::Period)
- {
- m_scanner->next();
- nodeFactory.markEndPosition();
- identifierPath.push_back(*expectIdentifierToken());
- }
- type = nodeFactory.createNode<UserDefinedTypeName>(identifierPath);
- }
+ type = parseUserDefinedTypeName();
else
fatalParserError(string("Expected type name"));
diff --git a/libsolidity/parsing/Parser.h b/libsolidity/parsing/Parser.h
index 5ff46242..eb1aa587 100644
--- a/libsolidity/parsing/Parser.h
+++ b/libsolidity/parsing/Parser.h
@@ -77,6 +77,7 @@ private:
ASTPointer<UsingForDirective> parseUsingDirective();
ASTPointer<ModifierInvocation> parseModifierInvocation();
ASTPointer<Identifier> parseIdentifier();
+ ASTPointer<UserDefinedTypeName> parseUserDefinedTypeName();
ASTPointer<TypeName> parseTypeName(bool _allowVar);
ASTPointer<Mapping> parseMapping();
ASTPointer<ParameterList> parseParameterList(
diff --git a/test/libsolidity/Imports.cpp b/test/libsolidity/Imports.cpp
index 57239cb9..f0f67785 100644
--- a/test/libsolidity/Imports.cpp
+++ b/test/libsolidity/Imports.cpp
@@ -97,7 +97,7 @@ BOOST_AUTO_TEST_CASE(simple_alias)
{
CompilerStack c;
c.addSource("a", "contract A {}");
- c.addSource("dir/a/b/c", "import \"../../.././a\" as x; contract B { function() { x.A r = x.A(20); } }");
+ c.addSource("dir/a/b/c", "import \"../../.././a\" as x; contract B is x.A { function() { x.A r = x.A(20); } }");
BOOST_CHECK(c.compile());
}