diff --git a/dsymbol/dub.json b/dsymbol/dub.json index 8e2c5e2..d00c563 100644 --- a/dsymbol/dub.json +++ b/dsymbol/dub.json @@ -6,7 +6,7 @@ "targetPath": "build", "targetType": "library", "dependencies": { - "libdparse": ">=0.20.0 <1.0.0", + "libdparse": ">=0.23.0 <1.0.0", "emsi_containers": "~>0.9.0" } } diff --git a/dsymbol/src/dsymbol/conversion/first.d b/dsymbol/src/dsymbol/conversion/first.d index d3611c2..9e37da0 100644 --- a/dsymbol/src/dsymbol/conversion/first.d +++ b/dsymbol/src/dsymbol/conversion/first.d @@ -723,20 +723,20 @@ final class FirstPass : ASTVisitor override void visit(const IfStatement ifs) { - if (ifs.identifier != tok!"" && ifs.thenStatement) + if (ifs.condition && ifs.condition.identifier != tok!"" && ifs.thenStatement) { pushScope(ifs.thenStatement.startLocation, ifs.thenStatement.endLocation); scope(exit) popScope(); - SemanticSymbol* symbol = allocateSemanticSymbol(ifs.identifier.text, - CompletionKind.variableName, symbolFile, ifs.identifier.index); - if (ifs.type !is null) - addTypeToLookups(symbol.typeLookups, ifs.type); + SemanticSymbol* symbol = allocateSemanticSymbol(ifs.condition.identifier.text, + CompletionKind.variableName, symbolFile, ifs.condition.identifier.index); + if (ifs.condition !is null && ifs.condition.type !is null) + addTypeToLookups(symbol.typeLookups, ifs.condition.type); symbol.parent = currentSymbol; currentSymbol.addChild(symbol, true); currentScope.addSymbol(symbol.acSymbol, true); - if (symbol.typeLookups.empty && ifs.expression !is null) - populateInitializer(symbol, ifs.expression, false); + if (symbol.typeLookups.empty && ifs.condition !is null && ifs.condition.expression !is null) + populateInitializer(symbol, ifs.condition.expression, false); } ifs.accept(this); } @@ -1125,7 +1125,10 @@ private: auto lookup = TypeLookupsAllocator.instance.make!TypeLookup(TypeLookupKind.initializer); scope visitor = new InitializerVisitor(lookup, appendForeach, this); symbol.typeLookups.insert(lookup); - visitor.visit(initializer); + static if (is(T == typeof(feExpression))) + visitor.dynamicDispatch(initializer); + else + visitor.visit(initializer); } SemanticSymbol* allocateSemanticSymbol(string name, CompletionKind kind, @@ -1395,6 +1398,7 @@ class InitializerVisitor : ASTVisitor } alias visit = ASTVisitor.visit; + alias dynamicDispatch = ASTVisitor.dynamicDispatch; override void visit(const FunctionLiteralExpression exp) { @@ -1476,7 +1480,7 @@ class InitializerVisitor : ASTVisitor override void visit(const IndexExpression expr) { - expr.unaryExpression.accept(this); + dynamicDispatch(expr.unaryExpression); foreach (index; expr.indexes) if (index.high is null) lookup.breadcrumbs.insert(ARRAY_SYMBOL_NAME); @@ -1568,10 +1572,10 @@ class InitializerVisitor : ASTVisitor on = false; } - override void visit(const ExpressionNode expression) + override void dynamicDispatch(const ExpressionNode expression) { on = true; - expression.accept(this); + super.dynamicDispatch(expression); if (appendForeach) lookup.breadcrumbs.insert(internString("foreach")); on = false; diff --git a/dsymbol/src/dsymbol/tests.d b/dsymbol/src/dsymbol/tests.d index 0c150f9..98d4e38 100644 --- a/dsymbol/src/dsymbol/tests.d +++ b/dsymbol/src/dsymbol/tests.d @@ -335,6 +335,8 @@ unittest DSymbol* S = pair.symbol.getFirstPartNamed(internString("S")); DSymbol* b = pair.symbol.getFirstPartNamed(internString("b")); assert(S); + assert(b); + assert(b.type); assert(b.type is S); } { @@ -343,6 +345,8 @@ unittest DSymbol* S = pair.symbol.getFirstPartNamed(internString("S")); DSymbol* b = pair.symbol.getFirstPartNamed(internString("b")); assert(S); + assert(b); + assert(b.type); assert(b.type is S); } { @@ -351,6 +355,8 @@ unittest DSymbol* S = pair.symbol.getFirstPartNamed(internString("S")); DSymbol* b = pair.symbol.getFirstPartNamed(internString("b")); assert(S); + assert(b); + assert(b.type); assert(b.type.type is S); } { @@ -359,6 +365,8 @@ unittest DSymbol* S = pair.symbol.getFirstPartNamed(internString("S")); DSymbol* b = pair.symbol.getFirstPartNamed(internString("b")); assert(S); + assert(b); + assert(b.type); assert(b.type.name == ARRAY_SYMBOL_NAME); assert(b.type.type is S); } @@ -368,6 +376,7 @@ unittest DSymbol* S = pair.symbol.getFirstPartNamed(internString("S")); DSymbol* b = pair.symbol.getFirstPartNamed(internString("b")); assert(S); + assert(b); assert(b.type is S); } } diff --git a/dub.json b/dub.json index db2dc8e..f5bade8 100644 --- a/dub.json +++ b/dub.json @@ -8,7 +8,7 @@ "license": "GPL-3.0", "dependencies": { ":dsymbol": "*", - "libdparse": ">=0.20.0 <0.23.0", + "libdparse": ">=0.23.0 <0.24.0", ":common": "*", "emsi_containers": "~>0.9.0" }, diff --git a/dub.selections.json b/dub.selections.json index 072114b..6513ec2 100644 --- a/dub.selections.json +++ b/dub.selections.json @@ -3,7 +3,7 @@ "versions": { "dsymbol": "0.14.1", "emsi_containers": "0.9.0", - "libdparse": "0.22.0", + "libdparse": "0.23.0", "msgpack-d": "1.0.4", "stdx-allocator": "2.77.5" } diff --git a/libdparse b/libdparse index 98bf0f4..86c9bf4 160000 --- a/libdparse +++ b/libdparse @@ -1 +1 @@ -Subproject commit 98bf0f4166578717e0b78472ff5054d6f918e797 +Subproject commit 86c9bf44c96e1666eb175c749cc26f62c2008979