Skip to content

Commit

Permalink
[IDE] Add array/dictionary literals in the document structure.
Browse files Browse the repository at this point in the history
rdar:/19999295

Swift SVN r25874
  • Loading branch information
akyrtzi committed Mar 9, 2015
1 parent b31875a commit da2e6ad
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 0 deletions.
2 changes: 2 additions & 0 deletions include/swift/IDE/SyntaxModel.h
Expand Up @@ -94,6 +94,8 @@ enum class SyntaxStructureKind : uint8_t {
Parameter,
BraceStatement,
CallExpression,
ArrayExpression,
DictionaryExpression,
};

enum class SyntaxStructureElementKind : uint8_t {
Expand Down
28 changes: 28 additions & 0 deletions lib/IDE/SyntaxModel.cpp
Expand Up @@ -325,6 +325,12 @@ std::pair<bool, Expr *> ModelASTWalker::walkToExprPre(Expr *E) {
}
}

auto addExprElem = [&](const Expr *Elem, SyntaxStructureNode &SN) {
SN.Elements.emplace_back(SyntaxStructureElementKind::Expr,
charSourceRangeFromSourceRange(SM,
Elem->getSourceRange()));
};

if (auto *CE = dyn_cast<CallExpr>(E)) {
SyntaxStructureNode SN;
SN.Kind = SyntaxStructureKind::CallExpression;
Expand All @@ -336,6 +342,28 @@ std::pair<bool, Expr *> ModelASTWalker::walkToExprPre(Expr *E) {
SN.BodyRange = innerCharSourceRangeFromSourceRange(SM,
CE->getArg()->getSourceRange());
pushStructureNode(SN, CE);

} else if (auto *ArrayE = dyn_cast<ArrayExpr>(E)) {
SyntaxStructureNode SN;
SN.Kind = SyntaxStructureKind::ArrayExpression;
SN.Range = charSourceRangeFromSourceRange(SM, E->getSourceRange());
for (auto *Elem : ArrayE->getElements())
addExprElem(Elem, SN);
pushStructureNode(SN, E);

} else if (auto *DictE = dyn_cast<DictionaryExpr>(E)) {
SyntaxStructureNode SN;
SN.Kind = SyntaxStructureKind::DictionaryExpression;
SN.Range = charSourceRangeFromSourceRange(SM, E->getSourceRange());
for (auto *Elem : DictE->getElements()) {
if (auto *TupleE = dyn_cast<TupleExpr>(Elem)) {
for (auto *TE : TupleE->getElements())
addExprElem(TE, SN);
} else {
addExprElem(Elem, SN);
}
}
pushStructureNode(SN, E);
}

return { true, E };
Expand Down
9 changes: 9 additions & 0 deletions test/IDE/structure.swift
Expand Up @@ -93,3 +93,12 @@ switch v {
case 2 where foo(), 3 where bar(): break;
default: break;
}

// CHECK: <gvar>let <name>myArray</name> = <array>[<elem-expr>1</elem-expr>, <elem-expr>2</elem-expr>, <elem-expr>3</elem-expr>]</array></gvar>
let myArray = [1, 2, 3]
// CHECK: <gvar>let <name>myDict</name> = <dictionary>[<elem-expr>1</elem-expr>:<elem-expr>1</elem-expr>, <elem-expr>2</elem-expr>:<elem-expr>2</elem-expr>, <elem-expr>3</elem-expr>:<elem-expr>3</elem-expr>]</dictionary></gvar>
let myDict = [1:1, 2:2, 3:3]
// CHECK: <gvar>let <name>myArray2</name> = <array>[<elem-expr>1</elem-expr>]</array></gvar>
let myArray2 = [1]
// CHECK: <gvar>let <name>myDict2</name> = <dictionary>[<elem-expr>1</elem-expr>:<elem-expr>1</elem-expr>]</dictionary></gvar>
let myDict2 = [1:1]
2 changes: 2 additions & 0 deletions tools/swift-ide-test/swift-ide-test.cpp
Expand Up @@ -798,6 +798,8 @@ class StructureAnnotator : public ide::SyntaxModelWalker {
case SyntaxStructureKind::CaseStatement: return "case";
case SyntaxStructureKind::BraceStatement: return "brace";
case SyntaxStructureKind::CallExpression: return "call";
case SyntaxStructureKind::ArrayExpression: return "array";
case SyntaxStructureKind::DictionaryExpression: return "dictionary";
}
llvm_unreachable("unhandled tag?");
}
Expand Down

0 comments on commit da2e6ad

Please sign in to comment.