From be6d1da1948822ad4cd60933d18983759d21710c Mon Sep 17 00:00:00 2001 From: tsuf239 <39455181+tsuf239@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:06:32 +0300 Subject: [PATCH] render child docs --- packages/@winglang/wingc/src/lsp/hover.rs | 91 +++++++++++++++++++ ...rent_class_docs_are_inherited_on_call.snap | 14 +++ ...ass_docs_are_inherited_on_declaration.snap | 14 +++ ...ass_docs_are_inherited_on_method_call.snap | 14 +++ ...s_are_inherited_on_method_declaration.snap | 14 +++ .../parent_class_docs_are_overridden.snap | 14 +++ .../lsp/snapshots/hovers/static_method.snap | 2 +- .../hovers/user_defined_type_annotation.snap | 4 +- .../user_defined_type_reference_property.snap | 2 +- .../user_defined_type_reference_type.snap | 4 +- .../snapshots/hovers/user_defined_types.snap | 4 +- .../lsp/snapshots/hovers/variadic_args.snap | 2 +- packages/@winglang/wingc/src/type_check.rs | 34 ++++++- 13 files changed, 200 insertions(+), 13 deletions(-) create mode 100644 packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_call.snap create mode 100644 packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_declaration.snap create mode 100644 packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_method_call.snap create mode 100644 packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_method_declaration.snap create mode 100644 packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_overridden.snap diff --git a/packages/@winglang/wingc/src/lsp/hover.rs b/packages/@winglang/wingc/src/lsp/hover.rs index dcb30179c7a..dedbcfa4a11 100644 --- a/packages/@winglang/wingc/src/lsp/hover.rs +++ b/packages/@winglang/wingc/src/lsp/hover.rs @@ -560,6 +560,97 @@ Json.stringify({}); "#, ); + test_hover_list!( + parent_class_docs_are_inherited_on_declaration, + r#" + /// Some parent docs +class Parent { + /// Some method docs + pub method() {} +} + +class Child extends Parent { + //^ + pub method() {} +} + +new Child().method(); + "#, + ); + + test_hover_list!( + parent_class_docs_are_inherited_on_method_declaration, + r#" + /// Some parent docs +class Parent { + /// Some method docs + pub method() {} +} + +class Child extends Parent { + pub method() {} + //^ +} + +new Child().method(); + "#, + ); + + test_hover_list!( + parent_class_docs_are_inherited_on_call, + r#" + /// Some parent docs +class Parent { + /// Some method docs + pub method() {} +} + +class Child extends Parent { + pub method() {} +} + +new Child().method(); + //^ + "#, + ); + + test_hover_list!( + parent_class_docs_are_inherited_on_method_call, + r#" + /// Some parent docs +class Parent { + /// Some method docs + pub method() {} +} + +class Child extends Parent { + pub method() {} + //^ +} + +new Child().method(); + //^ + "#, + ); + + test_hover_list!( + parent_class_docs_are_overridden, + r#" + /// Some parent docs +class Parent { + /// Some method docs + pub method() {} +} + + /// Some child docs +class Child extends Parent { +} + +new Child().method(); + //^ + "#, + ); + test_hover_list!( ignoe_empty_lines_in_doc, r#" diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_call.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_call.snap new file mode 100644 index 00000000000..d6a30791c62 --- /dev/null +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_call.snap @@ -0,0 +1,14 @@ +--- +source: packages/@winglang/wingc/src/lsp/hover.rs +--- +contents: + kind: markdown + value: "```wing\nnew(): Child\n```\n---\nSome parent docs" +range: + start: + line: 11 + character: 4 + end: + line: 11 + character: 9 + diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_declaration.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_declaration.snap new file mode 100644 index 00000000000..02ae5e13529 --- /dev/null +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_declaration.snap @@ -0,0 +1,14 @@ +--- +source: packages/@winglang/wingc/src/lsp/hover.rs +--- +contents: + kind: markdown + value: "```wing\nclass Child extends Parent {\n method(): void;\n}\n```\n---\nSome parent docs" +range: + start: + line: 7 + character: 6 + end: + line: 7 + character: 11 + diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_method_call.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_method_call.snap new file mode 100644 index 00000000000..4a54721be47 --- /dev/null +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_method_call.snap @@ -0,0 +1,14 @@ +--- +source: packages/@winglang/wingc/src/lsp/hover.rs +--- +contents: + kind: markdown + value: "```wing\npreflight method(): void\n```\n---\nSome method docs" +range: + start: + line: 8 + character: 6 + end: + line: 8 + character: 12 + diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_method_declaration.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_method_declaration.snap new file mode 100644 index 00000000000..4a54721be47 --- /dev/null +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_inherited_on_method_declaration.snap @@ -0,0 +1,14 @@ +--- +source: packages/@winglang/wingc/src/lsp/hover.rs +--- +contents: + kind: markdown + value: "```wing\npreflight method(): void\n```\n---\nSome method docs" +range: + start: + line: 8 + character: 6 + end: + line: 8 + character: 12 + diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_overridden.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_overridden.snap new file mode 100644 index 00000000000..e57ce9dca9a --- /dev/null +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/parent_class_docs_are_overridden.snap @@ -0,0 +1,14 @@ +--- +source: packages/@winglang/wingc/src/lsp/hover.rs +--- +contents: + kind: markdown + value: "```wing\nnew(): Child\n```\n---\nSome child docs" +range: + start: + line: 11 + character: 4 + end: + line: 11 + character: 9 + diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/static_method.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/static_method.snap index 9b2d87b76b2..d3c41fe20f2 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/hovers/static_method.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/static_method.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/hover.rs +source: packages/@winglang/wingc/src/lsp/hover.rs --- contents: kind: markdown diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_annotation.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_annotation.snap index 6b13f2f31fc..523293fdb19 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_annotation.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_annotation.snap @@ -1,9 +1,9 @@ --- -source: libs/wingc/src/lsp/hover.rs +source: packages/@winglang/wingc/src/lsp/hover.rs --- contents: kind: markdown - value: "```wing\nclass Foo {\n // No public members\n}\n```" + value: "```wing\nclass Foo {\n // No public members\n}\n```\n---\nShared behavior between all Wing SDK resources.\n\n*@noinflight*" range: start: line: 2 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_reference_property.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_reference_property.snap index c27d7bf34b3..4db37987892 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_reference_property.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_reference_property.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/hover.rs +source: packages/@winglang/wingc/src/lsp/hover.rs --- contents: kind: markdown diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_reference_type.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_reference_type.snap index 12427da76ad..19ec2b9e494 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_reference_type.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_type_reference_type.snap @@ -1,9 +1,9 @@ --- -source: libs/wingc/src/lsp/hover.rs +source: packages/@winglang/wingc/src/lsp/hover.rs --- contents: kind: markdown - value: "```wing\nclass Foo {\n // No public members\n}\n```" + value: "```wing\nclass Foo {\n // No public members\n}\n```\n---\nShared behavior between all Wing SDK resources.\n\n*@noinflight*" range: start: line: 4 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_types.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_types.snap index dcdd73534f3..818f47807b9 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_types.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/user_defined_types.snap @@ -1,9 +1,9 @@ --- -source: libs/wingc/src/lsp/hover.rs +source: packages/@winglang/wingc/src/lsp/hover.rs --- contents: kind: markdown - value: "```wing\nclass Foo {\n // No public members\n}\n```" + value: "```wing\nclass Foo {\n // No public members\n}\n```\n---\nShared behavior between all Wing SDK resources.\n\n*@noinflight*" range: start: line: 1 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/variadic_args.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/variadic_args.snap index b5b91c403d4..d3c17ce441b 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/hovers/variadic_args.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/variadic_args.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/hover.rs +source: packages/@winglang/wingc/src/lsp/hover.rs --- contents: kind: markdown diff --git a/packages/@winglang/wingc/src/type_check.rs b/packages/@winglang/wingc/src/type_check.rs index 66ba7fa0bdd..b0d61eae4b3 100644 --- a/packages/@winglang/wingc/src/type_check.rs +++ b/packages/@winglang/wingc/src/type_check.rs @@ -18,7 +18,7 @@ use crate::ast::{ }; use crate::comp_ctx::{CompilationContext, CompilationPhase}; use crate::diagnostic::{report_diagnostic, Diagnostic, DiagnosticAnnotation, DiagnosticSeverity, TypeError, WingSpan}; -use crate::docs::Docs; +use crate::docs::{Docs, Documented}; use crate::file_graph::{File, FileGraph}; use crate::parser::normalize_path; use crate::type_check::has_type_stmt::HasStatementVisitor; @@ -4157,7 +4157,7 @@ This value is set by the CLI at compile time and can be used to conditionally co let interface_spec = Interface { name: iface.name.clone(), fqn: format!("{}.{}", self.base_fqn_for_current_file(), iface.name), - docs: doc.as_ref().map_or(Docs::default(), |s| Docs::with_summary(s)), + docs: doc.as_ref().map_or(Docs::default(), |s: &String| Docs::with_summary(s)), env: dummy_env, extends: extend_interfaces.clone(), phase: iface.phase, @@ -4748,6 +4748,14 @@ This value is set by the CLI at compile time and can be used to conditionally co } } + let mut default_docs = Docs::default(); + // if parent docs exist we use them as the defualt + if let Some(parent_class) = parent_class { + if let Some(parent_docs) = parent_class.docs() { + default_docs = parent_docs.clone(); + } + } + // Create the resource/class type and add it to the current environment (so class implementation can reference itself) let class_spec = Class { name: ast_class.name.clone(), @@ -4758,7 +4766,7 @@ This value is set by the CLI at compile time and can be used to conditionally co is_abstract: false, phase: ast_class.phase, defined_in_phase: env.phase, - docs: stmt.doc.as_ref().map_or(Docs::default(), |s| Docs::with_summary(s)), + docs: stmt.doc.as_ref().map_or(default_docs, |s| Docs::with_summary(s)), std_construct_args: ast_class.phase == Phase::Preflight, lifts: None, uid: self.types.class_counter, @@ -4821,6 +4829,7 @@ This value is set by the CLI at compile time and can be used to conditionally co method_def.access, &mut class_env, method_name, + parent_class, ); method_types.insert(&method_name, method_type); } @@ -4839,6 +4848,7 @@ This value is set by the CLI at compile time and can be used to conditionally co ast_class.initializer.access, &mut class_env, &init_symb, + parent_class, ); method_types.insert(&init_symb, init_func_type); @@ -4857,6 +4867,7 @@ This value is set by the CLI at compile time and can be used to conditionally co ast_class.inflight_initializer.access, &mut class_env, &inflight_init_symb, + parent_class, ); method_types.insert(&inflight_init_symb, inflight_init_func_type); @@ -5759,6 +5770,7 @@ This value is set by the CLI at compile time and can be used to conditionally co access: AccessModifier, class_env: &mut SymbolEnv, method_name: &Symbol, + parent_class: Option>, ) { // Modify the method's type based on the fact we know it's a method and not just a function let method_sig = method_type @@ -5829,6 +5841,16 @@ This value is set by the CLI at compile time and can be used to conditionally co let method_phase = method_type.as_function_sig().unwrap().phase; + // use the parent's method docs as default, if exist. + let mut default_method_docs = None; + if let Some(parent_class) = parent_class { + if let Some(c) = parent_class.as_class() { + if let Some(parent_method) = c.methods(true).find(|m| m.1.name.eq(&method_name)) { + default_method_docs = parent_method.1.docs; + } + } + }; + match class_env.define( method_name, SymbolKind::make_member_variable( @@ -5838,7 +5860,11 @@ This value is set by the CLI at compile time and can be used to conditionally co instance_type.is_none(), method_phase, access, - method_def.doc.as_ref().map(|s| Docs::with_summary(s)), + method_def + .doc + .as_ref() + .map(|s| Docs::with_summary(s)) + .or(default_method_docs), ), access, StatementIdx::Top,