2
0
Эх сурвалжийг харах

[display] add support for more workspace symbol kinds

This allows to sync the icons with those used in vshaxe's document symbols and completion.
Jens Fischer 5 жил өмнө
parent
commit
04110ba0bc

+ 23 - 11
src/context/display/documentSymbols.ml

@@ -42,15 +42,23 @@ let collect_module_symbols with_locals (pack,decls) =
 		expr_opt parent f.f_expr
 	in
 	let is_deprecated meta = Meta.has Meta.Deprecated meta in
-	let field parent cff =
+	let field parent parent_kind cff =
 		let field_parent = parent ^ "." ^ (fst cff.cff_name) in
 		let add_field kind = add (fst cff.cff_name) kind cff.cff_pos parent (is_deprecated cff.cff_meta) in
 		match cff.cff_kind with
 		| FVar(_,eo) ->
-			add_field Field;
+			add_field (
+				if parent_kind = EnumAbstract && not (List.mem_assoc AStatic cff.cff_access) then EnumMember
+				else if (List.mem_assoc AInline cff.cff_access) then Constant
+				else Field
+			);
 			if with_locals then expr_opt field_parent eo
 		| FFun f ->
-			add_field (if fst cff.cff_name = "new" then Constructor else Method);
+			add_field (
+				if fst cff.cff_name = "new" then Constructor
+				else if ((parent_kind = EnumAbstract or parent_kind = Abstract) && Meta.has_one_of [Meta.Op; Meta.ArrayAccess; Meta.Resolve] cff.cff_meta) then Operator
+				else Method
+			);
 			if with_locals then func field_parent f
 		| FProp(_,_,_,eo) ->
 			add_field Property;
@@ -70,22 +78,26 @@ let collect_module_symbols with_locals (pack,decls) =
 		| EImport _ | EUsing _ ->
 			()
 		| EClass d ->
-			let parent = add_type d (if List.mem HInterface d.d_flags then Interface else Class) in
-			List.iter (field parent) d.d_data
+			let kind = if List.mem HInterface d.d_flags then Interface else Class in
+			let parent = add_type d kind in
+			List.iter (field parent kind) d.d_data
 		| EEnum d ->
 			let parent = add_type d Enum in
 			List.iter (fun ef ->
-				add (fst ef.ec_name) Method ef.ec_pos parent (is_deprecated ef.ec_meta)
+				add (fst ef.ec_name) EnumMember ef.ec_pos parent (is_deprecated ef.ec_meta)
 			) d.d_data
 		| ETypedef d ->
-			let parent = add_type d Typedef in
 			(match d.d_data with
 			| CTAnonymous fields,_ ->
-				List.iter (field parent) fields
-			| _ -> ())
+				let parent = add_type d Struct in
+				List.iter (field parent Struct) fields
+			| _ ->
+				ignore(add_type d TypeAlias)
+			)
 		| EAbstract d ->
-			let parent = add_type d Abstract in
-			List.iter (field parent) d.d_data
+			let kind = if Meta.has Meta.Enum d.d_meta then EnumAbstract else Abstract in
+			let parent = add_type d kind in
+			List.iter (field parent kind) d.d_data
 	) decls;
 	l
 

+ 12 - 2
src/core/displayTypes.ml

@@ -10,7 +10,7 @@ module SymbolKind = struct
 		| Class
 		| Interface
 		| Enum
-		| Typedef
+		| TypeAlias
 		| Abstract
 		| Field
 		| Property
@@ -18,12 +18,17 @@ module SymbolKind = struct
 		| Constructor
 		| Function
 		| Variable
+		| Struct
+		| EnumAbstract
+		| Operator
+		| EnumMember
+		| Constant
 
 	let to_int = function
 		| Class -> 1
 		| Interface -> 2
 		| Enum -> 3
-		| Typedef -> 4
+		| TypeAlias -> 4
 		| Abstract -> 5
 		| Field -> 6
 		| Property -> 7
@@ -31,6 +36,11 @@ module SymbolKind = struct
 		| Constructor -> 9
 		| Function -> 10
 		| Variable -> 11
+		| Struct -> 12
+		| EnumAbstract -> 13
+		| Operator -> 14
+		| EnumMember -> 15
+		| Constant -> 16
 end
 
 module SymbolInformation = struct

+ 18 - 11
tests/display/src/ModuleSymbolEntry.hx

@@ -1,21 +1,28 @@
 // Taken from vshaxe... not ideal to copy it here
 
 private enum abstract ModuleSymbolKind(Int) {
-	var MClass = 1;
-	var MInterface = 2;
-	var MEnum = 3;
-	var MTypedef = 4;
-	var MAbstract = 5;
-	var MField = 6;
-	var MProperty = 7;
-	var MMethod = 8;
-	var MConstructor = 9;
-	var MFunction = 10;
-	var MVariable = 11;
+	var Class = 1;
+	var Interface;
+	var Enum;
+	var TypeAlias;
+	var Abstract;
+	var Field;
+	var Property;
+	var Method;
+	var Constructor;
+	var Function;
+	var Variable;
+	var Struct;
+	var EnumAbstract;
+	var Operator;
+	var EnumMember;
+	var Constant;
 }
 
 typedef ModuleSymbolEntry = {
 	var name:String;
 	var kind:ModuleSymbolKind;
+	// var range:Range;
 	var ?containerName:String;
+	var ?isDeprecated:Bool;
 }

+ 44 - 24
tests/display/src/cases/DocumentSymbols.hx

@@ -12,12 +12,12 @@ class DocumentSymbols extends DisplayTestCase {
 	**/
 	function testClassFields() {
 		checkDocumentSymbols([
-			{name: "Some", kind: MClass, containerName: null},
-			{name: "main", kind: MMethod, containerName: "Some"},
-			{name: "x", kind: MField, containerName: "Some"},
-			{name: "y", kind: MField, containerName: "Some"},
-			{name: "z", kind: MProperty, containerName: "Some"},
-			{name: "new", kind: MConstructor, containerName: "Some"}
+			{name: "Some", kind: Class, containerName: null},
+			{name: "main", kind: Method, containerName: "Some"},
+			{name: "x", kind: Field, containerName: "Some"},
+			{name: "y", kind: Field, containerName: "Some"},
+			{name: "z", kind: Property, containerName: "Some"},
+			{name: "new", kind: Constructor, containerName: "Some"}
 		], ctx.documentSymbols());
 	}
 
@@ -28,8 +28,8 @@ class DocumentSymbols extends DisplayTestCase {
 	**/
 	function testInterface() {
 		checkDocumentSymbols([
-			{name: "Some", kind: MInterface, containerName: null},
-			{name: "test", kind: MMethod, containerName: "Some"}
+			{name: "Some", kind: Interface, containerName: null},
+			{name: "test", kind: Method, containerName: "Some"}
 		], ctx.documentSymbols());
 	}
 
@@ -41,9 +41,9 @@ class DocumentSymbols extends DisplayTestCase {
 	**/
 	function testEnum() {
 		checkDocumentSymbols([
-			{name: "E", kind: MEnum, containerName: null},
-			{name: "A", kind: MMethod, containerName: "E"},
-			{name: "B", kind: MMethod, containerName: "E"}
+			{name: "E", kind: Enum, containerName: null},
+			{name: "A", kind: EnumMember, containerName: "E"},
+			{name: "B", kind: EnumMember, containerName: "E"}
 		], ctx.documentSymbols());
 	}
 
@@ -54,8 +54,8 @@ class DocumentSymbols extends DisplayTestCase {
 	**/
 	function testTypedef() {
 		checkDocumentSymbols([
-			{name: "T", kind: MTypedef, containerName: null},
-			{name: "x", kind: MField, containerName: "T"}
+			{name: "T", kind: Struct, containerName: null},
+			{name: "x", kind: Field, containerName: "T"}
 		], ctx.documentSymbols());
 	}
 
@@ -63,13 +63,33 @@ class DocumentSymbols extends DisplayTestCase {
 		abstract A(Int) {
 			public function new() { }
 			function f() { }
+			@:op(A + B) function add(i:Int);
 		}
 	**/
 	function testAbstract() {
 		checkDocumentSymbols([
-			{name: "A", kind: MAbstract, containerName: null},
-			{name: "new", kind: MConstructor, containerName: "A"},
-			{name: "f", kind: MMethod, containerName: "A"}
+			{name: "A", kind: Abstract, containerName: null},
+			{name: "new", kind: Constructor, containerName: "A"},
+			{name: "f", kind: Method, containerName: "A"},
+			{name: "add", kind: Operator, containerName: "A"},
+			{name: "i", kind: Variable, containerName: "A.add"}
+		], ctx.documentSymbols());
+	}
+
+	/**
+		enum abstract E(Int) {
+			static inline var FOO = "test";
+			var A;
+			@:op(A + B) function add(i:Int);
+		}
+	**/
+	function testEnumAbstract() {
+		checkDocumentSymbols([
+			{name: "E", kind: EnumAbstract, containerName: null},
+			{name: "FOO", kind: Constant, containerName: "E"},
+			{name: "A", kind: EnumMember, containerName: "E"},
+			{name: "add", kind: Operator, containerName: "E"},
+			{name: "i", kind: Variable, containerName: "E.add"}
 		], ctx.documentSymbols());
 	}
 
@@ -85,14 +105,14 @@ class DocumentSymbols extends DisplayTestCase {
 	**/
 	function testExpression() {
 		checkDocumentSymbols([
-			{name: "Main", kind: MClass, containerName: null},
-			{name: "main", kind: MMethod, containerName: "Main"},
-			{name: "a", kind: MVariable, containerName: "Main.main"},
-			{name: "b", kind: MVariable, containerName: "Main.main"},
-			{name: "c", kind: MVariable, containerName: "Main.main"},
-			{name: "d", kind: MVariable, containerName: "Main.main"},
-			{name: "e", kind: MVariable, containerName: "Main.main"},
-			{name: "f", kind: MFunction, containerName: "Main.main"}
+			{name: "Main", kind: Class, containerName: null},
+			{name: "main", kind: Method, containerName: "Main"},
+			{name: "a", kind: Variable, containerName: "Main.main"},
+			{name: "b", kind: Variable, containerName: "Main.main"},
+			{name: "c", kind: Variable, containerName: "Main.main"},
+			{name: "d", kind: Variable, containerName: "Main.main"},
+			{name: "e", kind: Variable, containerName: "Main.main"},
+			{name: "f", kind: Function, containerName: "Main.main"}
 		], ctx.documentSymbols());
 	}