From 26d120af2467d75ca317c3c7e7147bb6e392764d Mon Sep 17 00:00:00 2001 From: Matthew Nitschke Date: Tue, 28 Mar 2023 16:57:32 -0500 Subject: [PATCH 1/4] fixed issue with formal field parameters on constructors that are named --- lib/src/scip_visitor.dart | 1 + lib/src/symbol.dart | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/src/scip_visitor.dart b/lib/src/scip_visitor.dart index 234f0df..875090e 100644 --- a/lib/src/scip_visitor.dart +++ b/lib/src/scip_visitor.dart @@ -97,6 +97,7 @@ class ScipVisitor extends GeneralizingAstVisitor { // EX: `color(path, front: Styles.YELLOW);` where `color` comes from the chalk-dart package if (element == null || element.source == null) return; + if (node.inDeclarationContext()) { _registerAsDefinition(element); } else { diff --git a/lib/src/symbol.dart b/lib/src/symbol.dart index f2e7414..611fb26 100644 --- a/lib/src/symbol.dart +++ b/lib/src/symbol.dart @@ -189,6 +189,11 @@ class SymbolGenerator { return '${_getDescriptor(encEle)}[${element.name}]'; } + if (element is FieldElement || element is FieldFormalParameterElement) { + final encEle = element.enclosingElement; + return '${_getDescriptor(encEle!)}${element.name}.'; + } + // only generate symbols for named parameters, all others are 'local x' if (element is ParameterElement && element.isNamed) { final encEle = element.enclosingElement; @@ -214,11 +219,6 @@ class SymbolGenerator { ].join(); } - if (element is FieldElement) { - final encEle = element.enclosingElement; - return '${_getDescriptor(encEle)}${element.name}.'; - } - display('\n' 'Received unknown type (${element.runtimeType})\n' '\tname: ${element.name}\n' From 0d7ec9a7ec4e4523e71ba9205ffccdd4d5c72096 Mon Sep 17 00:00:00 2001 From: Matthew Nitschke Date: Wed, 29 Mar 2023 11:05:17 -0500 Subject: [PATCH 2/4] parity with editor navigation --- lib/src/scip_visitor.dart | 18 +++--- lib/src/symbol.dart | 10 +-- snapshots/input/basic-project/lib/more.dart | 6 +- snapshots/output/basic-project/lib/more.dart | 62 ++++++++++--------- snapshots/output/basic-project/lib/other.dart | 4 +- 5 files changed, 55 insertions(+), 45 deletions(-) diff --git a/lib/src/scip_visitor.dart b/lib/src/scip_visitor.dart index 875090e..0359495 100644 --- a/lib/src/scip_visitor.dart +++ b/lib/src/scip_visitor.dart @@ -76,21 +76,23 @@ class ScipVisitor extends GeneralizingAstVisitor { final element = node.declaredElement; if (element == null) return; - // FieldFormalParameters reference a field instead of define a declaration - // register them as such - if (element is FieldFormalParameterElement) { + if (node is FieldFormalParameter) { + final fieldElement = (element as FieldFormalParameterElement).field; _registerAsReference( - element.field!, - offset: node.name!.offset, - length: node.name!.length, + fieldElement!, + offset: node.thisKeyword.offset, + length: node.thisKeyword.length, ); - } else { - _registerAsDefinition(element); } + + _registerAsDefinition(element); } + + void _visitSimpleIdentifier(SimpleIdentifier node) { final element = node.staticElement; + // print(':: $node ${node.runtimeType} ${element.runtimeType}'); // element is null if there's nothing really to do for this node. Example: `void` // TODO: One weird issue found: named parameters of external symbols were element.source diff --git a/lib/src/symbol.dart b/lib/src/symbol.dart index 611fb26..168a019 100644 --- a/lib/src/symbol.dart +++ b/lib/src/symbol.dart @@ -189,11 +189,6 @@ class SymbolGenerator { return '${_getDescriptor(encEle)}[${element.name}]'; } - if (element is FieldElement || element is FieldFormalParameterElement) { - final encEle = element.enclosingElement; - return '${_getDescriptor(encEle!)}${element.name}.'; - } - // only generate symbols for named parameters, all others are 'local x' if (element is ParameterElement && element.isNamed) { final encEle = element.enclosingElement; @@ -210,6 +205,11 @@ class SymbolGenerator { return '${_getDescriptor(encEle)}(${element.name})'; } + if (element is FieldElement) { + final encEle = element.enclosingElement; + return '${_getDescriptor(encEle)}${element.name}.'; + } + if (element is PropertyAccessorElement) { final parentName = element.enclosingElement.name; return [ diff --git a/snapshots/input/basic-project/lib/more.dart b/snapshots/input/basic-project/lib/more.dart index 3a590dd..371f09f 100644 --- a/snapshots/input/basic-project/lib/more.dart +++ b/snapshots/input/basic-project/lib/more.dart @@ -19,7 +19,7 @@ class Animal with SleepMixin { AnimalType type; SoundMaker? soundMaker; - Animal(this.name, this.type) { + Animal(this.name, {required this.type}) { switch (type) { case AnimalType.cat: soundMaker = () => print('Meow!'); @@ -53,8 +53,8 @@ void main() { List numbers = [1, 2, 3, 4, 5]; int sum = calculateSum(numbers); - Animal cat = Animal('Kitty', AnimalType.cat); - Animal dog = Animal('Buddy', AnimalType.dog); + Animal cat = Animal('Kitty', type: AnimalType.cat); + Animal dog = Animal('Buddy', type: AnimalType.dog); cat.makeSound(); cat.sleep(); diff --git a/snapshots/output/basic-project/lib/more.dart b/snapshots/output/basic-project/lib/more.dart index 75eb3c2..7d67319 100755 --- a/snapshots/output/basic-project/lib/more.dart +++ b/snapshots/output/basic-project/lib/more.dart @@ -49,12 +49,16 @@ // ^^^^^^^^^^ definition scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#soundMaker. // documentation ```dart - Animal(this.name, this.type) { + Animal(this.name, {required this.type}) { // ^^^^^^ definition scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#(). // documentation ```dart // ^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal# -// ^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#name. -// ^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#type. +// ^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#name. +// ^^^^ definition local 0 +// documentation ```dart +// ^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#type. +// ^^^^ definition scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#().(type) +// documentation ```dart switch (type) { // ^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#type. case AnimalType.cat: @@ -106,17 +110,17 @@ // documentation ```dart // ^^^^ reference scip-dart pub dart:core 2.18.0 dart:core/list.dart/List# // ^^^ reference scip-dart pub dart:core 2.18.0 dart:core/int.dart/int# -// ^^^^^^^ definition local 0 +// ^^^^^^^ definition local 1 // documentation ```dart return numbers.reduce((value, element) => value + element); -// ^^^^^^^ reference local 0 +// ^^^^^^^ reference local 1 // ^^^^^^ reference scip-dart pub dart:core 2.18.0 dart:core/iterable.dart/Iterable#reduce(). -// ^^^^^ definition local 1 +// ^^^^^ definition local 2 // documentation ```dart -// ^^^^^^^ definition local 2 +// ^^^^^^^ definition local 3 // documentation ```dart -// ^^^^^ reference local 1 -// ^^^^^^^ reference local 2 +// ^^^^^ reference local 2 +// ^^^^^^^ reference local 3 } void main() { @@ -125,54 +129,56 @@ List numbers = [1, 2, 3, 4, 5]; // ^^^^ reference scip-dart pub dart:core 2.18.0 dart:core/list.dart/List# // ^^^ reference scip-dart pub dart:core 2.18.0 dart:core/int.dart/int# -// ^^^^^^^ definition local 3 +// ^^^^^^^ definition local 4 // documentation ```dart int sum = calculateSum(numbers); // ^^^ reference scip-dart pub dart:core 2.18.0 dart:core/int.dart/int# -// ^^^ definition local 4 +// ^^^ definition local 5 // documentation ```dart // ^^^^^^^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/calculateSum(). -// ^^^^^^^ reference local 3 +// ^^^^^^^ reference local 4 - Animal cat = Animal('Kitty', AnimalType.cat); + Animal cat = Animal('Kitty', type: AnimalType.cat); // ^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal# -// ^^^ definition local 5 +// ^^^ definition local 6 // documentation ```dart // ^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal# -// ^^^^^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/AnimalType# -// ^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/AnimalType#cat. - Animal dog = Animal('Buddy', AnimalType.dog); +// ^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#().(type) +// ^^^^^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/AnimalType# +// ^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/AnimalType#cat. + Animal dog = Animal('Buddy', type: AnimalType.dog); // ^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal# -// ^^^ definition local 6 +// ^^^ definition local 7 // documentation ```dart // ^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal# -// ^^^^^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/AnimalType# -// ^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/AnimalType#dog. +// ^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#().(type) +// ^^^^^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/AnimalType# +// ^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/AnimalType#dog. cat.makeSound(); -// ^^^ reference local 5 +// ^^^ reference local 6 // ^^^^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#makeSound(). cat.sleep(); -// ^^^ reference local 5 +// ^^^ reference local 6 // ^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/SleepMixin#sleep(). dog.makeSound(); -// ^^^ reference local 6 +// ^^^ reference local 7 // ^^^^^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/Animal#makeSound(). dog.sleep(); -// ^^^ reference local 6 +// ^^^ reference local 7 // ^^^^^ reference scip-dart pub dart_test 1.0.0 lib/more.dart/SleepMixin#sleep(). print(cat); // ^^^^^ reference scip-dart pub dart:core 2.18.0 dart:core/print.dart/print(). -// ^^^ reference local 5 +// ^^^ reference local 6 print(dog); // ^^^^^ reference scip-dart pub dart:core 2.18.0 dart:core/print.dart/print(). -// ^^^ reference local 6 +// ^^^ reference local 7 print('The sum of $numbers is $sum'); // ^^^^^ reference scip-dart pub dart:core 2.18.0 dart:core/print.dart/print(). -// ^^^^^^^ reference local 3 -// ^^^ reference local 4 +// ^^^^^^^ reference local 4 +// ^^^ reference local 5 print(math.Rectangle(1,2,3,4)); // ^^^^^ reference scip-dart pub dart:core 2.18.0 dart:core/print.dart/print(). diff --git a/snapshots/output/basic-project/lib/other.dart b/snapshots/output/basic-project/lib/other.dart index 65f6a1c..bc000eb 100755 --- a/snapshots/output/basic-project/lib/other.dart +++ b/snapshots/output/basic-project/lib/other.dart @@ -10,6 +10,8 @@ // ^^^ definition scip-dart pub dart_test 1.0.0 lib/other.dart/Foo#(). // documentation ```dart // ^^^ reference scip-dart pub dart_test 1.0.0 lib/other.dart/Foo# -// ^^^^ reference local 0 +// ^^^^ reference local 0 +// ^^^^ definition local 1 +// documentation ```dart } From 1b7622e8e468240a5b534ff0e0c2d993ae5de3c6 Mon Sep 17 00:00:00 2001 From: Matthew Nitschke Date: Wed, 29 Mar 2023 11:05:54 -0500 Subject: [PATCH 3/4] reverted symbol changes --- lib/src/symbol.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/src/symbol.dart b/lib/src/symbol.dart index 168a019..f2e7414 100644 --- a/lib/src/symbol.dart +++ b/lib/src/symbol.dart @@ -205,11 +205,6 @@ class SymbolGenerator { return '${_getDescriptor(encEle)}(${element.name})'; } - if (element is FieldElement) { - final encEle = element.enclosingElement; - return '${_getDescriptor(encEle)}${element.name}.'; - } - if (element is PropertyAccessorElement) { final parentName = element.enclosingElement.name; return [ @@ -219,6 +214,11 @@ class SymbolGenerator { ].join(); } + if (element is FieldElement) { + final encEle = element.enclosingElement; + return '${_getDescriptor(encEle)}${element.name}.'; + } + display('\n' 'Received unknown type (${element.runtimeType})\n' '\tname: ${element.name}\n' From 9a783e57c69553eb48349aaff54ab923123e0c76 Mon Sep 17 00:00:00 2001 From: Matthew Nitschke Date: Wed, 29 Mar 2023 11:13:49 -0500 Subject: [PATCH 4/4] removed print --- lib/src/scip_visitor.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/src/scip_visitor.dart b/lib/src/scip_visitor.dart index 0359495..c0b044c 100644 --- a/lib/src/scip_visitor.dart +++ b/lib/src/scip_visitor.dart @@ -92,14 +92,12 @@ class ScipVisitor extends GeneralizingAstVisitor { void _visitSimpleIdentifier(SimpleIdentifier node) { final element = node.staticElement; - // print(':: $node ${node.runtimeType} ${element.runtimeType}'); // element is null if there's nothing really to do for this node. Example: `void` // TODO: One weird issue found: named parameters of external symbols were element.source // EX: `color(path, front: Styles.YELLOW);` where `color` comes from the chalk-dart package if (element == null || element.source == null) return; - if (node.inDeclarationContext()) { _registerAsDefinition(element); } else {