diff --git a/conversion/first.d b/conversion/first.d index 5479813..0e17fe6 100644 --- a/conversion/first.d +++ b/conversion/first.d @@ -128,9 +128,33 @@ final class FirstPass : ASTVisitor currentSymbol.addChild(symbol); if (dec.functionBody !is null) { + import std.algorithm; + size_t scopeBegin = min( + dec.functionBody.inStatement is null ? size_t.max : dec.functionBody.inStatement.blockStatement.startLocation, + dec.functionBody.outStatement is null ? size_t.max : dec.functionBody.outStatement.blockStatement.startLocation, + dec.functionBody.blockStatement is null ? size_t.max : dec.functionBody.blockStatement.startLocation, + dec.functionBody.bodyStatement is null ? size_t.max : dec.functionBody.bodyStatement.blockStatement.startLocation); + size_t scopeEnd = max( + dec.functionBody.inStatement is null ? 0 : dec.functionBody.inStatement.blockStatement.endLocation, + dec.functionBody.outStatement is null ? 0 : dec.functionBody.outStatement.blockStatement.endLocation, + dec.functionBody.blockStatement is null ? 0 : dec.functionBody.blockStatement.endLocation, + dec.functionBody.bodyStatement is null ? 0 : dec.functionBody.bodyStatement.blockStatement.endLocation); + foreach (child; symbol.children) + { + if (child.acSymbol.location == size_t.max) + { +// Log.trace("Reassigning location of ", child.acSymbol.name); + child.acSymbol.location = scopeBegin + 1; + } + } + Scope* s = allocate!Scope(semanticAllocator, scopeBegin, scopeEnd); + currentScope.children.insert(s); + s.parent = currentScope; + currentScope = s; currentSymbol = symbol; dec.functionBody.accept(this); currentSymbol = symbol.parent; + currentScope = s.parent; } } @@ -377,17 +401,6 @@ final class FirstPass : ASTVisitor s.parent = currentScope; currentScope.children.insert(s); - if (currentSymbol.acSymbol.kind == CompletionKind.functionName) - { - foreach (child; currentSymbol.children) - { - if (child.acSymbol.location == size_t.max) - { -// Log.trace("Reassigning location of ", child.acSymbol.name); - child.acSymbol.location = s.startLocation + 1; - } - } - } if (blockStatement.declarationsAndStatements !is null) { currentScope = s; diff --git a/conversion/second.d b/conversion/second.d index a7362e4..4b68445 100644 --- a/conversion/second.d +++ b/conversion/second.d @@ -59,6 +59,12 @@ private: void assignToScopes(ACSymbol* currentSymbol) { Scope* s = moduleScope.getScopeByCursor(currentSymbol.location); + // Look for a parent scope whose start location equals this scope's + // start location. This only happens in the case of functions with + // contracts. Use this outer scope that covers the in, out, and body + // instead of the smaller scope found by getScopeByCursor. + if (s.parent !is null && s.parent.startLocation == s.startLocation) + s = s.parent; if (currentSymbol.kind != CompletionKind.moduleName) s.symbols.insert(currentSymbol); foreach (part; currentSymbol.parts[]) diff --git a/libdparse b/libdparse index 5a39c33..d9fb61d 160000 --- a/libdparse +++ b/libdparse @@ -1 +1 @@ -Subproject commit 5a39c333a1264753b067d4ba34ebfa1e7a2f04fa +Subproject commit d9fb61d666304a4fcede0b583202fde3e0498785