diff --git a/SolutionProperties/ReleaseNotes.txt b/SolutionProperties/ReleaseNotes.txt index 2587182..45e147c 100644 --- a/SolutionProperties/ReleaseNotes.txt +++ b/SolutionProperties/ReleaseNotes.txt @@ -1 +1 @@ -- Updated Microsoft.CodeAnalysis.CSharp.Workspaces package. +- Fixed missing `global::` prefix for the underlying callee. diff --git a/Tests/Tum4ik.StinimGen.Specs/Features/Event/Event.feature b/Tests/Tum4ik.StinimGen.Specs/Features/Event/Event.feature index 2c442aa..dab5fa8 100644 --- a/Tests/Tum4ik.StinimGen.Specs/Features/Event/Event.feature +++ b/Tests/Tum4ik.StinimGen.Specs/Features/Event/Event.feature @@ -32,13 +32,13 @@ Scenario: Event field with EventHandler type Then there must not be generation exception And generated interface member must be """ - /// + /// event global::System.EventHandler EventMember; """ And generated implementation member must be """ /// - public event global::System.EventHandler EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; } + public event global::System.EventHandler EventMember { add => global::Events.EventHolder.EventMember += value; remove => global::Events.EventHolder.EventMember -= value; } """ @@ -51,13 +51,13 @@ Scenario: Event field with custom type Then there must not be generation exception And generated interface member must be """ - /// + /// event global::Events.CustomEventHandler EventMember; """ And generated implementation member must be """ /// - public event global::Events.CustomEventHandler EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; } + public event global::Events.CustomEventHandler EventMember { add => global::Events.EventHolder.EventMember += value; remove => global::Events.EventHolder.EventMember -= value; } """ @@ -70,13 +70,13 @@ Scenario: Event field with Action type Then there must not be generation exception And generated interface member must be """ - /// + /// event global::System.Action EventMember; """ And generated implementation member must be """ /// - public event global::System.Action EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; } + public event global::System.Action EventMember { add => global::Events.EventHolder.EventMember += value; remove => global::Events.EventHolder.EventMember -= value; } """ @@ -89,13 +89,13 @@ Scenario: Event field with Action type with keyworded generic parameter Then there must not be generation exception And generated interface member must be """ - /// + /// event global::System.Action EventMember; """ And generated implementation member must be """ /// - public event global::System.Action EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; } + public event global::System.Action EventMember { add => global::Events.EventHolder.EventMember += value; remove => global::Events.EventHolder.EventMember -= value; } """ @@ -108,13 +108,13 @@ Scenario: Event field with Action type with keyworded nullable generic parameter Then there must not be generation exception And generated interface member must be """ - /// + /// event global::System.Action EventMember; """ And generated implementation member must be """ /// - public event global::System.Action EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; } + public event global::System.Action EventMember { add => global::Events.EventHolder.EventMember += value; remove => global::Events.EventHolder.EventMember -= value; } """ @@ -127,13 +127,13 @@ Scenario: Event field with Action type with non-keyworded generic parameter Then there must not be generation exception And generated interface member must be """ - /// + /// event global::System.Action EventMember; """ And generated implementation member must be """ /// - public event global::System.Action EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; } + public event global::System.Action EventMember { add => global::Events.EventHolder.EventMember += value; remove => global::Events.EventHolder.EventMember -= value; } """ @@ -146,13 +146,13 @@ Scenario: Event field with Action type with non-keyworded nullable generic param Then there must not be generation exception And generated interface member must be """ - /// + /// event global::System.Action EventMember; """ And generated implementation member must be """ /// - public event global::System.Action EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; } + public event global::System.Action EventMember { add => global::Events.EventHolder.EventMember += value; remove => global::Events.EventHolder.EventMember -= value; } """ @@ -165,13 +165,13 @@ Scenario: Event field with Func Then there must not be generation exception And generated interface member must be """ - /// + /// event global::System.Func EventMember; """ And generated implementation member must be """ /// - public event global::System.Func EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; } + public event global::System.Func EventMember { add => global::Events.EventHolder.EventMember += value; remove => global::Events.EventHolder.EventMember -= value; } """ @@ -189,13 +189,13 @@ Scenario: Full event Then there must not be generation exception And generated interface member must be """ - /// + /// event global::System.EventHandler FullEvent; """ And generated implementation member must be """ /// - public event global::System.EventHandler FullEvent { add => Events.EventHolder.FullEvent += value; remove => Events.EventHolder.FullEvent -= value; } + public event global::System.EventHandler FullEvent { add => global::Events.EventHolder.FullEvent += value; remove => global::Events.EventHolder.FullEvent -= value; } """ @@ -209,7 +209,7 @@ Scenario: Forward Obsolete attribute Then there must not be generation exception And generated interface member must be """ - /// + /// [global::System.ObsoleteAttribute("Obsolete event")] event global::System.EventHandler ObsoleteEvent; """ @@ -217,5 +217,5 @@ Scenario: Forward Obsolete attribute """ /// [global::System.ObsoleteAttribute("Obsolete event")] - public event global::System.EventHandler ObsoleteEvent { add => Events.EventHolder.ObsoleteEvent += value; remove => Events.EventHolder.ObsoleteEvent -= value; } + public event global::System.EventHandler ObsoleteEvent { add => global::Events.EventHolder.ObsoleteEvent += value; remove => global::Events.EventHolder.ObsoleteEvent -= value; } """ diff --git a/Tests/Tum4ik.StinimGen.Specs/Features/Field/ConstField.feature b/Tests/Tum4ik.StinimGen.Specs/Features/Field/ConstField.feature index d127029..54a8134 100644 --- a/Tests/Tum4ik.StinimGen.Specs/Features/Field/ConstField.feature +++ b/Tests/Tum4ik.StinimGen.Specs/Features/Field/ConstField.feature @@ -30,13 +30,13 @@ Scenario: Field with keyworded type Then there must not be generation exception And generated interface member must be """ - /// + /// int ConstField { get; } """ And generated implementation member must be """ /// - public int ConstField { get => Fields.FieldHolder.ConstField; } + public int ConstField { get => global::Fields.FieldHolder.ConstField; } """ @@ -49,11 +49,11 @@ Scenario: Field with non-keyworded type Then there must not be generation exception And generated interface member must be """ - /// + /// double ConstField { get; } """ And generated implementation member must be """ /// - public double ConstField { get => Fields.FieldHolder.ConstField; } + public double ConstField { get => global::Fields.FieldHolder.ConstField; } """ diff --git a/Tests/Tum4ik.StinimGen.Specs/Features/Field/Field.feature b/Tests/Tum4ik.StinimGen.Specs/Features/Field/Field.feature index b7f9d68..703aae9 100644 --- a/Tests/Tum4ik.StinimGen.Specs/Features/Field/Field.feature +++ b/Tests/Tum4ik.StinimGen.Specs/Features/Field/Field.feature @@ -30,13 +30,13 @@ Scenario: Non-nullable field with keyworded type Then there must not be generation exception And generated interface member must be """ - /// + /// object StaticField { get; set; } """ And generated implementation member must be """ /// - public object StaticField { get => Fields.FieldHolder.StaticField; set => Fields.FieldHolder.StaticField = value; } + public object StaticField { get => global::Fields.FieldHolder.StaticField; set => global::Fields.FieldHolder.StaticField = value; } """ @@ -49,13 +49,13 @@ Scenario: Nullable field with keyworded type Then there must not be generation exception And generated interface member must be """ - /// + /// object? StaticField { get; set; } """ And generated implementation member must be """ /// - public object? StaticField { get => Fields.FieldHolder.StaticField; set => Fields.FieldHolder.StaticField = value; } + public object? StaticField { get => global::Fields.FieldHolder.StaticField; set => global::Fields.FieldHolder.StaticField = value; } """ @@ -68,13 +68,13 @@ Scenario: Non-nullable field Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Delegate StaticField { get; set; } """ And generated implementation member must be """ /// - public global::System.Delegate StaticField { get => Fields.FieldHolder.StaticField; set => Fields.FieldHolder.StaticField = value; } + public global::System.Delegate StaticField { get => global::Fields.FieldHolder.StaticField; set => global::Fields.FieldHolder.StaticField = value; } """ @@ -87,13 +87,13 @@ Scenario: Nullable field Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Delegate? StaticField { get; set; } """ And generated implementation member must be """ /// - public global::System.Delegate? StaticField { get => Fields.FieldHolder.StaticField; set => Fields.FieldHolder.StaticField = value; } + public global::System.Delegate? StaticField { get => global::Fields.FieldHolder.StaticField; set => global::Fields.FieldHolder.StaticField = value; } """ @@ -107,7 +107,7 @@ Scenario: Forward Obsolete attribute Then there must not be generation exception And generated interface member must be """ - /// + /// [global::System.ObsoleteAttribute("Obsolete field")] object ObsoleteField { get; set; } """ @@ -115,5 +115,5 @@ Scenario: Forward Obsolete attribute """ /// [global::System.ObsoleteAttribute("Obsolete field")] - public object ObsoleteField { get => Fields.FieldHolder.ObsoleteField; set => Fields.FieldHolder.ObsoleteField = value; } + public object ObsoleteField { get => global::Fields.FieldHolder.ObsoleteField; set => global::Fields.FieldHolder.ObsoleteField = value; } """ diff --git a/Tests/Tum4ik.StinimGen.Specs/Features/Field/ReadonlyField.feature b/Tests/Tum4ik.StinimGen.Specs/Features/Field/ReadonlyField.feature index ec8857c..d243529 100644 --- a/Tests/Tum4ik.StinimGen.Specs/Features/Field/ReadonlyField.feature +++ b/Tests/Tum4ik.StinimGen.Specs/Features/Field/ReadonlyField.feature @@ -30,13 +30,13 @@ Scenario: Non-nullable field with keyworded type Then there must not be generation exception And generated interface member must be """ - /// + /// float StaticReadonlyField { get; } """ And generated implementation member must be """ /// - public float StaticReadonlyField { get => Fields.FieldHolder.StaticReadonlyField; } + public float StaticReadonlyField { get => global::Fields.FieldHolder.StaticReadonlyField; } """ @@ -49,13 +49,13 @@ Scenario: Nullable field with keyworded type Then there must not be generation exception And generated interface member must be """ - /// + /// float? StaticReadonlyField { get; } """ And generated implementation member must be """ /// - public float? StaticReadonlyField { get => Fields.FieldHolder.StaticReadonlyField; } + public float? StaticReadonlyField { get => global::Fields.FieldHolder.StaticReadonlyField; } """ @@ -68,13 +68,13 @@ Scenario: Non-nullable field Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.StringComparer StaticReadonlyField { get; } """ And generated implementation member must be """ /// - public global::System.StringComparer StaticReadonlyField { get => Fields.FieldHolder.StaticReadonlyField; } + public global::System.StringComparer StaticReadonlyField { get => global::Fields.FieldHolder.StaticReadonlyField; } """ @@ -87,11 +87,11 @@ Scenario: Nullable field Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.StringComparer? StaticReadonlyField { get; } """ And generated implementation member must be """ /// - public global::System.StringComparer? StaticReadonlyField { get => Fields.FieldHolder.StaticReadonlyField; } + public global::System.StringComparer? StaticReadonlyField { get => global::Fields.FieldHolder.StaticReadonlyField; } """ diff --git a/Tests/Tum4ik.StinimGen.Specs/Features/Method/GenericMethod.feature b/Tests/Tum4ik.StinimGen.Specs/Features/Method/GenericMethod.feature index 8bdf444..7ffc847 100644 --- a/Tests/Tum4ik.StinimGen.Specs/Features/Method/GenericMethod.feature +++ b/Tests/Tum4ik.StinimGen.Specs/Features/Method/GenericMethod.feature @@ -33,13 +33,13 @@ Scenario: Void method with a generic parameter and without parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(); """ And generated implementation member must be """ /// - public void Method() => Methods.MethodHolder.Method(); + public void Method() => global::Methods.MethodHolder.Method(); """ @@ -52,13 +52,13 @@ Scenario: Void method with several generic parameters and without parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(); """ And generated implementation member must be """ /// - public void Method() => Methods.MethodHolder.Method(); + public void Method() => global::Methods.MethodHolder.Method(); """ @@ -71,13 +71,13 @@ Scenario: Method without parameters returns generic type Then there must not be generation exception And generated interface member must be """ - /// + /// T Method(); """ And generated implementation member must be """ /// - public T Method() => Methods.MethodHolder.Method(); + public T Method() => global::Methods.MethodHolder.Method(); """ @@ -90,13 +90,13 @@ Scenario: Method with parameters returns generic type Then there must not be generation exception And generated interface member must be """ - /// + /// T1 Method(T1 p1, T2 p2); """ And generated implementation member must be """ /// - public T1 Method(T1 p1, T2 p2) => Methods.MethodHolder.Method(p1, p2); + public T1 Method(T1 p1, T2 p2) => global::Methods.MethodHolder.Method(p1, p2); """ @@ -109,13 +109,13 @@ Scenario: Async method without parameters returns Task of generic type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Threading.Tasks.Task MethodAsync(); """ And generated implementation member must be """ /// - public global::System.Threading.Tasks.Task MethodAsync() => Methods.MethodHolder.MethodAsync(); + public global::System.Threading.Tasks.Task MethodAsync() => global::Methods.MethodHolder.MethodAsync(); """ @@ -128,7 +128,7 @@ Scenario: Generic method with a constraint Then there must not be generation exception And generated interface member must be """ - /// + /// void Method() where T : class, new(); """ @@ -136,7 +136,7 @@ Scenario: Generic method with a constraint """ /// public void Method() - where T : class, new() => Methods.MethodHolder.Method(); + where T : class, new() => global::Methods.MethodHolder.Method(); """ @@ -152,7 +152,7 @@ Scenario: Generic method with several constraints Then there must not be generation exception And generated interface member must be """ - /// + /// void Method() where TParent : class where TChild : TParent, new(); """ @@ -160,5 +160,5 @@ Scenario: Generic method with several constraints """ /// public void Method() - where TParent : class where TChild : TParent, new() => Methods.MethodHolder.Method(); + where TParent : class where TChild : TParent, new() => global::Methods.MethodHolder.Method(); """ diff --git a/Tests/Tum4ik.StinimGen.Specs/Features/Method/RegularMethod.feature b/Tests/Tum4ik.StinimGen.Specs/Features/Method/RegularMethod.feature index e3c9cde..8571ddf 100644 --- a/Tests/Tum4ik.StinimGen.Specs/Features/Method/RegularMethod.feature +++ b/Tests/Tum4ik.StinimGen.Specs/Features/Method/RegularMethod.feature @@ -35,13 +35,13 @@ Scenario: Void method without parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(); """ And generated implementation member must be """ /// - public void Method() => Methods.MethodHolder.Method(); + public void Method() => global::Methods.MethodHolder.Method(); """ @@ -54,13 +54,13 @@ Scenario: Method without parameters returns keyworded type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.String Method(); """ And generated implementation member must be """ /// - public global::System.String Method() => Methods.MethodHolder.Method(); + public global::System.String Method() => global::Methods.MethodHolder.Method(); """ @@ -73,13 +73,13 @@ Scenario: Method without parameters returns keyworded nullable type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.String? Method(); """ And generated implementation member must be """ /// - public global::System.String? Method() => Methods.MethodHolder.Method(); + public global::System.String? Method() => global::Methods.MethodHolder.Method(); """ @@ -92,13 +92,13 @@ Scenario: Method without parameters returns non-nullable type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Text.StringBuilder Method(); """ And generated implementation member must be """ /// - public global::System.Text.StringBuilder Method() => Methods.MethodHolder.Method(); + public global::System.Text.StringBuilder Method() => global::Methods.MethodHolder.Method(); """ @@ -111,13 +111,13 @@ Scenario: Method without parameters returns nullable type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Text.StringBuilder? Method(); """ And generated implementation member must be """ /// - public global::System.Text.StringBuilder? Method() => Methods.MethodHolder.Method(); + public global::System.Text.StringBuilder? Method() => global::Methods.MethodHolder.Method(); """ @@ -130,13 +130,13 @@ Scenario: Async void method without parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void MethodAsync(); """ And generated implementation member must be """ /// - public void MethodAsync() => Methods.MethodHolder.MethodAsync(); + public void MethodAsync() => global::Methods.MethodHolder.MethodAsync(); """ @@ -149,13 +149,13 @@ Scenario: Async method without parameters returns Task Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Threading.Tasks.Task MethodAsync(); """ And generated implementation member must be """ /// - public global::System.Threading.Tasks.Task MethodAsync() => Methods.MethodHolder.MethodAsync(); + public global::System.Threading.Tasks.Task MethodAsync() => global::Methods.MethodHolder.MethodAsync(); """ @@ -168,13 +168,13 @@ Scenario: Method without parameters returns Taks of keyworded type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Threading.Tasks.Task MethodAsync(); """ And generated implementation member must be """ /// - public global::System.Threading.Tasks.Task MethodAsync() => Methods.MethodHolder.MethodAsync(); + public global::System.Threading.Tasks.Task MethodAsync() => global::Methods.MethodHolder.MethodAsync(); """ @@ -187,13 +187,13 @@ Scenario: Method without parameters returns Task of keyworded nullable type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Threading.Tasks.Task MethodAsync(); """ And generated implementation member must be """ /// - public global::System.Threading.Tasks.Task MethodAsync() => Methods.MethodHolder.MethodAsync(); + public global::System.Threading.Tasks.Task MethodAsync() => global::Methods.MethodHolder.MethodAsync(); """ @@ -206,13 +206,13 @@ Scenario: Method without parameters returns Task of non-nullable type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Threading.Tasks.Task MethodAsync(); """ And generated implementation member must be """ /// - public global::System.Threading.Tasks.Task MethodAsync() => Methods.MethodHolder.MethodAsync(); + public global::System.Threading.Tasks.Task MethodAsync() => global::Methods.MethodHolder.MethodAsync(); """ @@ -225,13 +225,13 @@ Scenario: Method without parameters returns Task of nullable type Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Threading.Tasks.Task MethodAsync(); """ And generated implementation member must be """ /// - public global::System.Threading.Tasks.Task MethodAsync() => Methods.MethodHolder.MethodAsync(); + public global::System.Threading.Tasks.Task MethodAsync() => global::Methods.MethodHolder.MethodAsync(); """ @@ -244,13 +244,13 @@ Scenario: Void method with a parameter Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(global::System.Int32 p); """ And generated implementation member must be """ /// - public void Method(global::System.Int32 p) => Methods.MethodHolder.Method(p); + public void Method(global::System.Int32 p) => global::Methods.MethodHolder.Method(p); """ @@ -263,13 +263,13 @@ Scenario: Void method with default parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(global::System.Int32 p1, global::System.String p2 = "def", global::System.Int32 p3 = 10); """ And generated implementation member must be """ /// - public void Method(global::System.Int32 p1, global::System.String p2 = "def", global::System.Int32 p3 = 10) => Methods.MethodHolder.Method(p1, p2, p3); + public void Method(global::System.Int32 p1, global::System.String p2 = "def", global::System.Int32 p3 = 10) => global::Methods.MethodHolder.Method(p1, p2, p3); """ @@ -282,13 +282,13 @@ Scenario: Void method with several keyworded parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(global::System.Int32 p1, global::System.String[] p2, global::System.Single? p3, global::System.Double? [] p4, global::System.Object[]? p5); """ And generated implementation member must be """ /// - public void Method(global::System.Int32 p1, global::System.String[] p2, global::System.Single? p3, global::System.Double? [] p4, global::System.Object[]? p5) => Methods.MethodHolder.Method(p1, p2, p3, p4, p5); + public void Method(global::System.Int32 p1, global::System.String[] p2, global::System.Single? p3, global::System.Double? [] p4, global::System.Object[]? p5) => global::Methods.MethodHolder.Method(p1, p2, p3, p4, p5); """ @@ -301,13 +301,13 @@ Scenario: Void method with several non-keyworded parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(global::System.DateTime p1, global::System.DateTime[] p2, global::System.DateTime? p3, global::System.DateTime? [] p4, global::System.DateTime[]? p5); """ And generated implementation member must be """ /// - public void Method(global::System.DateTime p1, global::System.DateTime[] p2, global::System.DateTime? p3, global::System.DateTime? [] p4, global::System.DateTime[]? p5) => Methods.MethodHolder.Method(p1, p2, p3, p4, p5); + public void Method(global::System.DateTime p1, global::System.DateTime[] p2, global::System.DateTime? p3, global::System.DateTime? [] p4, global::System.DateTime[]? p5) => global::Methods.MethodHolder.Method(p1, p2, p3, p4, p5); """ @@ -320,13 +320,13 @@ Scenario: Void method with several keyworded generic parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(global::System.Collections.Generic.List p1, global::System.Collections.Generic.List p2, global::System.Collections.Generic.List p3, global::System.Collections.Generic.List p4, global::System.Collections.Generic.List p5); """ And generated implementation member must be """ /// - public void Method(global::System.Collections.Generic.List p1, global::System.Collections.Generic.List p2, global::System.Collections.Generic.List p3, global::System.Collections.Generic.List p4, global::System.Collections.Generic.List p5) => Methods.MethodHolder.Method(p1, p2, p3, p4, p5); + public void Method(global::System.Collections.Generic.List p1, global::System.Collections.Generic.List p2, global::System.Collections.Generic.List p3, global::System.Collections.Generic.List p4, global::System.Collections.Generic.List p5) => global::Methods.MethodHolder.Method(p1, p2, p3, p4, p5); """ @@ -339,13 +339,13 @@ Scenario: Void method with several non-keyworded generic parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(global::System.Collections.Generic.List p1, global::System.Collections.Generic.List p2, global::System.Collections.Generic.List p3, global::System.Collections.Generic.List p4, global::System.Collections.Generic.List p5); """ And generated implementation member must be """ /// - public void Method(global::System.Collections.Generic.List p1, global::System.Collections.Generic.List p2, global::System.Collections.Generic.List p3, global::System.Collections.Generic.List p4, global::System.Collections.Generic.List p5) => Methods.MethodHolder.Method(p1, p2, p3, p4, p5); + public void Method(global::System.Collections.Generic.List p1, global::System.Collections.Generic.List p2, global::System.Collections.Generic.List p3, global::System.Collections.Generic.List p4, global::System.Collections.Generic.List p5) => global::Methods.MethodHolder.Method(p1, p2, p3, p4, p5); """ @@ -358,13 +358,13 @@ Scenario: Void method with ref/out/in and params parameters Then there must not be generation exception And generated interface member must be """ - /// + /// void Method(ref global::System.Int32 refP, out global::System.Double? outP, in global::System.DateTime inP, params global::System.DateTime? [] paramsP); """ And generated implementation member must be """ /// - public void Method(ref global::System.Int32 refP, out global::System.Double? outP, in global::System.DateTime inP, params global::System.DateTime? [] paramsP) => Methods.MethodHolder.Method(ref refP, out outP, in inP, paramsP); + public void Method(ref global::System.Int32 refP, out global::System.Double? outP, in global::System.DateTime inP, params global::System.DateTime? [] paramsP) => global::Methods.MethodHolder.Method(ref refP, out outP, in inP, paramsP); """ @@ -378,7 +378,7 @@ Scenario: Forward Obsolete attribute Then there must not be generation exception And generated interface member must be """ - /// + /// [global::System.ObsoleteAttribute("Obsolete method")] void ObsoleteMethod(); """ @@ -386,7 +386,7 @@ Scenario: Forward Obsolete attribute """ /// [global::System.ObsoleteAttribute("Obsolete method")] - public void ObsoleteMethod() => Methods.MethodHolder.ObsoleteMethod(); + public void ObsoleteMethod() => global::Methods.MethodHolder.ObsoleteMethod(); """ @@ -403,11 +403,11 @@ Scenario: Forward parameters attributes Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.Boolean TryParse([global::System.Diagnostics.CodeAnalysis.NotNullWhenAttribute(true)] global::System.String? s, [global::System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute(false)][global::System.Diagnostics.CodeAnalysis.DisallowNullAttribute][global::System.Diagnostics.CodeAnalysis.AllowNullAttribute] out global::System.Int32 result); """ And generated implementation member must be """ /// - public global::System.Boolean TryParse([global::System.Diagnostics.CodeAnalysis.NotNullWhenAttribute(true)] global::System.String? s, [global::System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute(false)][global::System.Diagnostics.CodeAnalysis.DisallowNullAttribute][global::System.Diagnostics.CodeAnalysis.AllowNullAttribute] out global::System.Int32 result) => Methods.MethodHolder.TryParse(s, out result); + public global::System.Boolean TryParse([global::System.Diagnostics.CodeAnalysis.NotNullWhenAttribute(true)] global::System.String? s, [global::System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute(false)][global::System.Diagnostics.CodeAnalysis.DisallowNullAttribute][global::System.Diagnostics.CodeAnalysis.AllowNullAttribute] out global::System.Int32 result) => global::Methods.MethodHolder.TryParse(s, out result); """ diff --git a/Tests/Tum4ik.StinimGen.Specs/Features/Property/Property.feature b/Tests/Tum4ik.StinimGen.Specs/Features/Property/Property.feature index d0842d3..8947390 100644 --- a/Tests/Tum4ik.StinimGen.Specs/Features/Property/Property.feature +++ b/Tests/Tum4ik.StinimGen.Specs/Features/Property/Property.feature @@ -31,13 +31,13 @@ Scenario: Property with only getter Then there must not be generation exception And generated interface member must be """ - /// + /// int Property { get; } """ And generated implementation member must be """ /// - public int Property { get => Properties.PropertyHolder.Property; } + public int Property { get => global::Properties.PropertyHolder.Property; } """ @@ -51,13 +51,13 @@ Scenario: Property with only setter Then there must not be generation exception And generated interface member must be """ - /// + /// float? Property { set; } """ And generated implementation member must be """ /// - public float? Property { set => Properties.PropertyHolder.Property = value; } + public float? Property { set => global::Properties.PropertyHolder.Property = value; } """ @@ -70,13 +70,13 @@ Scenario: Property with getter and setter Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.IO.Stream Property { get; set; } """ And generated implementation member must be """ /// - public global::System.IO.Stream Property { get => Properties.PropertyHolder.Property; set => Properties.PropertyHolder.Property = value; } + public global::System.IO.Stream Property { get => global::Properties.PropertyHolder.Property; set => global::Properties.PropertyHolder.Property = value; } """ @@ -89,13 +89,13 @@ Scenario: Property with getter and private setter Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.IO.Stream? Property { get; } """ And generated implementation member must be """ /// - public global::System.IO.Stream? Property { get => Properties.PropertyHolder.Property; } + public global::System.IO.Stream? Property { get => global::Properties.PropertyHolder.Property; } """ @@ -108,13 +108,13 @@ Scenario: Property with getter and protected setter Then there must not be generation exception And generated interface member must be """ - /// + /// global::System.IO.Stream? Property { get; } """ And generated implementation member must be """ /// - public global::System.IO.Stream? Property { get => Properties.PropertyHolder.Property; } + public global::System.IO.Stream? Property { get => global::Properties.PropertyHolder.Property; } """ @@ -127,13 +127,13 @@ Scenario: Property with private getter and setter Then there must not be generation exception And generated interface member must be """ - /// + /// float? Property { set; } """ And generated implementation member must be """ /// - public float? Property { set => Properties.PropertyHolder.Property = value; } + public float? Property { set => global::Properties.PropertyHolder.Property = value; } """ @@ -147,13 +147,13 @@ Scenario: Property with protected getter and setter Then there must not be generation exception And generated interface member must be """ - /// + /// string Property { set; } """ And generated implementation member must be """ /// - public string Property { set => Properties.PropertyHolder.Property = value; } + public string Property { set => global::Properties.PropertyHolder.Property = value; } """ @@ -167,7 +167,7 @@ Scenario: Forward Obsolete attribute Then there must not be generation exception And generated interface member must be """ - /// + /// [global::System.ObsoleteAttribute("Obsolete property")] int ObsoleteProperty { get; } """ @@ -175,5 +175,5 @@ Scenario: Forward Obsolete attribute """ /// [global::System.ObsoleteAttribute("Obsolete property")] - public int ObsoleteProperty { get => Properties.PropertyHolder.ObsoleteProperty; } + public int ObsoleteProperty { get => global::Properties.PropertyHolder.ObsoleteProperty; } """ diff --git a/Tum4ik.StinimGen/Extensions/SymbolExtensions.cs b/Tum4ik.StinimGen/Extensions/SymbolExtensions.cs index c2f7189..2ba07d1 100644 --- a/Tum4ik.StinimGen/Extensions/SymbolExtensions.cs +++ b/Tum4ik.StinimGen/Extensions/SymbolExtensions.cs @@ -5,6 +5,17 @@ namespace Tum4ik.StinimGen.Extensions; internal static class SymbolExtensions { + /// + /// Gets the fully qualified name for a given symbol + /// + /// The input instance. + /// The fully qualified name for . + public static string GetFullyQualifiedName(this ISymbol symbol) + { + return symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + } + + /// /// Gets the fully qualified name for a given symbol, including nullability annotations /// diff --git a/Tum4ik.StinimGen/Extensions/TypeSymbolExtensions.cs b/Tum4ik.StinimGen/Extensions/TypeSymbolExtensions.cs index 303a60f..9b62afb 100644 --- a/Tum4ik.StinimGen/Extensions/TypeSymbolExtensions.cs +++ b/Tum4ik.StinimGen/Extensions/TypeSymbolExtensions.cs @@ -1,60 +1,9 @@ using System.Collections.Immutable; -using System.Text; using Microsoft.CodeAnalysis; namespace Tum4ik.StinimGen.Extensions; internal static class TypeSymbolExtensions { - /// - /// Gets the fully qualified metadata name for a given instance. - /// - /// The input instance. - /// The fully qualified metadata name for . - public static string GetFullyQualifiedMetadataName(this ITypeSymbol symbol) - { - var builder = new StringBuilder(); - symbol.AppendFullyQualifiedMetadataName(builder); - return builder.ToString(); - } - - private static void AppendFullyQualifiedMetadataName(this ISymbol symbol, StringBuilder builder) - { - switch (symbol) - { - // Namespaces that are nested also append a leading '.' - case INamespaceSymbol { ContainingNamespace.IsGlobalNamespace: false }: - AppendFullyQualifiedMetadataName(symbol.ContainingNamespace, builder); - builder.Append('.'); - builder.Append(symbol.MetadataName); - break; - - // Other namespaces (ie. the one right before global) skip the leading '.' - case INamespaceSymbol { IsGlobalNamespace: false }: - builder.Append(symbol.MetadataName); - break; - - // Types with no namespace just have their metadata name directly written - case ITypeSymbol { ContainingSymbol: INamespaceSymbol { IsGlobalNamespace: true } }: - builder.Append(symbol.MetadataName); - break; - - // Types with a containing non-global namespace also append a leading '.' - case ITypeSymbol { ContainingSymbol: INamespaceSymbol namespaceSymbol }: - AppendFullyQualifiedMetadataName(namespaceSymbol, builder); - builder.Append('.'); - builder.Append(symbol.MetadataName); - break; - - // Nested types append a leading '+' - case ITypeSymbol { ContainingSymbol: ITypeSymbol typeSymbol }: - AppendFullyQualifiedMetadataName(typeSymbol, builder); - builder.Append('+'); - builder.Append(symbol.MetadataName); - break; - } - } - - public static ImmutableArray GetMembersIncludingBaseTypes(this ITypeSymbol symbol, Func predicate) { @@ -65,6 +14,6 @@ public static ImmutableArray GetMembersIncludingBaseTypes(this ITypeSym { members.AddRange(symbol.BaseType.GetMembersIncludingBaseTypes(predicate)); } - return members.ToImmutableArray(); + return [.. members]; } } diff --git a/Tum4ik.StinimGen/IIGenerator.cs b/Tum4ik.StinimGen/IIGenerator.cs index 5d6bbe6..b47c98b 100644 --- a/Tum4ik.StinimGen/IIGenerator.cs +++ b/Tum4ik.StinimGen/IIGenerator.cs @@ -151,8 +151,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context) p => p.GetAttributes() .Where( a => a.AttributeClass? - .GetFullyQualifiedMetadataName()? - .StartsWith("System.Diagnostics.CodeAnalysis") + .GetFullyQualifiedName()? + .StartsWith("global::System.Diagnostics.CodeAnalysis") is true ) .Select(a => (AttributeListSyntax) syntaxGenerator.Attribute(a)) @@ -204,7 +204,7 @@ is true PropertyInfoList: propertyInfoList.ToImmutableArray(), EventInfoList: eventInfoList.ToImmutableArray(), MethodInfoList: methodInfoList.ToImmutableArray(), - SourceFullyQualifiedName: sourceNamedTypeSymbol.GetFullyQualifiedMetadataName(), + SourceFullyQualifiedName: sourceNamedTypeSymbol.GetFullyQualifiedName(), SourceForwardedAttributes: sourceForwardedAttributes ); }