Dreamine.MVVM.Generators 1.0.13
Dreamine.MVVM.Generators 프로젝트의 API와 구성 요소를 제공합니다.
로딩중...
검색중...
일치하는것 없음
Dreamine.MVVM.Generators.DreamineEntryGenerator 클래스 참조sealed

DreamineEntryAttribute가 적용된 WPF 엔트리 클래스를 분석하고 Dreamine 부트스트랩 코드를 생성하는 증분 생성기입니다. 더 자세히 ...

Dreamine.MVVM.Generators.DreamineEntryGenerator에 대한 상속 다이어그램 :
Dreamine.MVVM.Generators.DreamineEntryGenerator에 대한 협력 다이어그램:

Public 멤버 함수

void Initialize (IncrementalGeneratorInitializationContext context)
 증분 생성기 파이프라인을 초기화합니다.

정적 Private 멤버 함수

static bool IsCandidateSyntax (SyntaxNode node)
 엔트리 후보가 될 수 있는 구문인지 확인합니다.
static ? EntryCandidateModel TryCreateCandidate (GeneratorSyntaxContext context, INamedTypeSymbol? entryAttributeSymbol, INamedTypeSymbol? applicationSymbol)
 구문/시맨틱 정보를 기반으로 엔트리 후보 모델을 생성합니다.
static void Emit (SourceProductionContext context, ImmutableArray< EntryCandidateModel > candidates)
 수집된 엔트리 후보를 진단하고 소스를 생성합니다.
static bool IsPartial (ClassDeclarationSyntax classDeclaration)
 클래스 선언이 partial인지 확인합니다.
static bool InheritsFrom (INamedTypeSymbol symbol, INamedTypeSymbol baseTypeSymbol)
 대상 클래스가 지정한 기반 타입을 상속하는지 확인합니다.
static string BuildEntrySource (string namespaceName, string className)
 엔트리 부트스트랩 소스 코드를 생성합니다.

정적 Private 속성

const string EntryAttributeMetadataName = "Dreamine.MVVM.Attributes.DreamineEntryAttribute"
const string WpfApplicationMetadataName = "System.Windows.Application"
static readonly DiagnosticDescriptor EntryMustBePartialDescriptor
static readonly DiagnosticDescriptor EntryMustInheritApplicationDescriptor
static readonly DiagnosticDescriptor DuplicateEntryDescriptor

상세한 설명

DreamineEntryAttribute가 적용된 WPF 엔트리 클래스를 분석하고 Dreamine 부트스트랩 코드를 생성하는 증분 생성기입니다.

DreamineEntryGenerator.cs 파일의 15 번째 라인에서 정의되었습니다.

멤버 함수 문서화

◆ BuildEntrySource()

string Dreamine.MVVM.Generators.DreamineEntryGenerator.BuildEntrySource ( string namespaceName,
string className )
inlinestaticprivate

엔트리 부트스트랩 소스 코드를 생성합니다.

매개변수
namespaceName대상 네임스페이스입니다.
className대상 클래스 이름입니다.
반환값
생성된 C# 소스 코드 문자열입니다.

DreamineEntryGenerator.cs 파일의 243 번째 라인에서 정의되었습니다.

244 {
245 string namespaceBlockStart = string.IsNullOrWhiteSpace(namespaceName)
246 ? string.Empty
247 : $"namespace {namespaceName}\r\n{{";
248
249 string namespaceBlockEnd = string.IsNullOrWhiteSpace(namespaceName)
250 ? string.Empty
251 : "}";
252
253 return $$"""
254// <auto-generated />
255#nullable enable
256using System.Windows;
257using Dreamine.MVVM.Wpf;
258
259{{namespaceBlockStart}}
260 public partial class {{className}}
261 {
266 protected override void OnStartup(StartupEventArgs e)
267 {
268 base.OnStartup(e);
269
270 var rootAssembly = typeof({{className}}).Assembly;
271
272 RegisterBefore();
273
274 DreamineWpfOptions options = DreamineWpfOptions.CreateDefault();
275 ConfigureDreamine(options);
276
277 DreamineAppBuilder.Initialize(rootAssembly, options);
278
279 ShowMainWindow();
280 Dispatcher.InvokeAsync(() => RegisterAfter());
281 }
282
286 static partial void RegisterBefore();
287
292 static partial void ConfigureDreamine(DreamineWpfOptions options);
293
297 static partial void RegisterAfter();
298
302 static partial void ShowMainWindow();
303 }
304{{namespaceBlockEnd}}
305""";
306 }

다음에 의해서 참조됨 : Emit().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Emit()

void Dreamine.MVVM.Generators.DreamineEntryGenerator.Emit ( SourceProductionContext context,
ImmutableArray< EntryCandidateModel > candidates )
inlinestaticprivate

수집된 엔트리 후보를 진단하고 소스를 생성합니다.

매개변수
context소스 출력 컨텍스트입니다.
candidates수집된 엔트리 후보 목록입니다.

DreamineEntryGenerator.cs 파일의 146 번째 라인에서 정의되었습니다.

149 {
150 if (candidates.IsDefaultOrEmpty)
151 {
152 return;
153 }
154
155 foreach (EntryCandidateModel candidate in candidates)
156 {
157 if (!candidate.IsPartial)
158 {
159 context.ReportDiagnostic(Diagnostic.Create(
160 EntryMustBePartialDescriptor,
161 candidate.ClassDeclaration.Identifier.GetLocation(),
162 candidate.ClassName));
163 }
164
165 if (!candidate.IsApplicationDerived)
166 {
167 context.ReportDiagnostic(Diagnostic.Create(
168 EntryMustInheritApplicationDescriptor,
169 candidate.ClassDeclaration.Identifier.GetLocation(),
170 candidate.ClassName));
171 }
172 }
173
174 ImmutableArray<EntryCandidateModel> validCandidates = candidates
175 .Where(static candidate => candidate.IsPartial && candidate.IsApplicationDerived)
176 .ToImmutableArray();
177
178 if (validCandidates.Length == 0)
179 {
180 return;
181 }
182
183 if (validCandidates.Length > 1)
184 {
185 foreach (EntryCandidateModel candidate in validCandidates)
186 {
187 context.ReportDiagnostic(Diagnostic.Create(
188 DuplicateEntryDescriptor,
189 candidate.ClassDeclaration.Identifier.GetLocation(),
190 candidate.ClassName));
191 }
192
193 return;
194 }
195
196 EntryCandidateModel entryCandidate = validCandidates[0];
197 string source = BuildEntrySource(entryCandidate.Namespace, entryCandidate.ClassName);
198
199 context.AddSource(
200 $"{entryCandidate.ClassName}.DreamineEntry.g.cs",
201 SourceText.From(source, Encoding.UTF8));
202 }

다음을 참조함 : BuildEntrySource(), DuplicateEntryDescriptor, EntryMustBePartialDescriptor, EntryMustInheritApplicationDescriptor.

다음에 의해서 참조됨 : Initialize().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ InheritsFrom()

bool Dreamine.MVVM.Generators.DreamineEntryGenerator.InheritsFrom ( INamedTypeSymbol symbol,
INamedTypeSymbol baseTypeSymbol )
inlinestaticprivate

대상 클래스가 지정한 기반 타입을 상속하는지 확인합니다.

매개변수
symbol검사할 클래스 심볼입니다.
baseTypeSymbol기준 기반 타입 심볼입니다.
반환값
상속 관계가 있으면 true이고, 아니면 false입니다.

DreamineEntryGenerator.cs 파일의 220 번째 라인에서 정의되었습니다.

221 {
222 INamedTypeSymbol? current = symbol;
223
224 while (current is not null)
225 {
226 if (SymbolEqualityComparer.Default.Equals(current, baseTypeSymbol))
227 {
228 return true;
229 }
230
231 current = current.BaseType;
232 }
233
234 return false;
235 }

다음에 의해서 참조됨 : TryCreateCandidate().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Initialize()

void Dreamine.MVVM.Generators.DreamineEntryGenerator.Initialize ( IncrementalGeneratorInitializationContext context)
inline

증분 생성기 파이프라인을 초기화합니다.

매개변수
context생성기 초기화 컨텍스트입니다.

DreamineEntryGenerator.cs 파일의 48 번째 라인에서 정의되었습니다.

49 {
50 IncrementalValueProvider<INamedTypeSymbol?> entryAttributeSymbolProvider =
51 context.CompilationProvider.Select(
52 static (compilation, _) => compilation.GetTypeByMetadataName(EntryAttributeMetadataName));
53
54 IncrementalValueProvider<INamedTypeSymbol?> applicationSymbolProvider =
55 context.CompilationProvider.Select(
56 static (compilation, _) => compilation.GetTypeByMetadataName(WpfApplicationMetadataName));
57
58 IncrementalValueProvider<(INamedTypeSymbol? EntryAttributeSymbol, INamedTypeSymbol? ApplicationSymbol)> symbolsProvider =
59 entryAttributeSymbolProvider.Combine(applicationSymbolProvider);
60
61 IncrementalValueProvider<ImmutableArray<EntryCandidateModel>> candidateProvider =
62 context.SyntaxProvider
63 .CreateSyntaxProvider(
64 predicate: static (node, _) => IsCandidateSyntax(node),
65 transform: static (syntaxContext, _) => syntaxContext)
66 .Combine(symbolsProvider)
67 .Select(static (pair, _) => TryCreateCandidate(pair.Left, pair.Right.EntryAttributeSymbol, pair.Right.ApplicationSymbol))
68 .Where(static candidate => candidate is not null)
69 .Select(static (candidate, _) => candidate!)
70 .Collect();
71
72 context.RegisterSourceOutput(candidateProvider, static (sourceProductionContext, candidates) =>
73 {
74 Emit(sourceProductionContext, candidates);
75 });
76 }

다음을 참조함 : Emit(), EntryAttributeMetadataName, IsCandidateSyntax(), TryCreateCandidate(), WpfApplicationMetadataName.

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ IsCandidateSyntax()

bool Dreamine.MVVM.Generators.DreamineEntryGenerator.IsCandidateSyntax ( SyntaxNode node)
inlinestaticprivate

엔트리 후보가 될 수 있는 구문인지 확인합니다.

매개변수
node검사할 구문 노드입니다.
반환값
후보가 될 수 있으면 true이고, 아니면 false입니다.

DreamineEntryGenerator.cs 파일의 83 번째 라인에서 정의되었습니다.

84 {
85 return node is ClassDeclarationSyntax classDeclaration &&
86 classDeclaration.AttributeLists.Count > 0;
87 }

다음에 의해서 참조됨 : Initialize().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ IsPartial()

bool Dreamine.MVVM.Generators.DreamineEntryGenerator.IsPartial ( ClassDeclarationSyntax classDeclaration)
inlinestaticprivate

클래스 선언이 partial인지 확인합니다.

매개변수
classDeclaration검사할 클래스 선언입니다.
반환값
partial이면 true이고, 아니면 false입니다.

DreamineEntryGenerator.cs 파일의 209 번째 라인에서 정의되었습니다.

210 {
211 return classDeclaration.Modifiers.Any(static modifier => modifier.IsKind(Microsoft.CodeAnalysis.CSharp.SyntaxKind.PartialKeyword));
212 }

다음에 의해서 참조됨 : TryCreateCandidate().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ TryCreateCandidate()

? EntryCandidateModel Dreamine.MVVM.Generators.DreamineEntryGenerator.TryCreateCandidate ( GeneratorSyntaxContext context,
INamedTypeSymbol? entryAttributeSymbol,
INamedTypeSymbol? applicationSymbol )
inlinestaticprivate

구문/시맨틱 정보를 기반으로 엔트리 후보 모델을 생성합니다.

매개변수
context구문 분석 컨텍스트입니다.
entryAttributeSymbolDreamineEntryAttribute 심볼입니다.
applicationSymbolWPF Application 심볼입니다.
반환값
엔트리 후보이면 EntryCandidateModel를 반환하고, 아니면 null을 반환합니다.

DreamineEntryGenerator.cs 파일의 99 번째 라인에서 정의되었습니다.

103 {
104 if (entryAttributeSymbol is null || applicationSymbol is null)
105 {
106 return null;
107 }
108
109 if (context.Node is not ClassDeclarationSyntax classDeclaration)
110 {
111 return null;
112 }
113
114 if (context.SemanticModel.GetDeclaredSymbol(classDeclaration) is not INamedTypeSymbol classSymbol)
115 {
116 return null;
117 }
118
119 bool hasEntryAttribute = classSymbol
120 .GetAttributes()
121 .Any(attribute => SymbolEqualityComparer.Default.Equals(attribute.AttributeClass, entryAttributeSymbol));
122
123 if (!hasEntryAttribute)
124 {
125 return null;
126 }
127
128 string namespaceName = classSymbol.ContainingNamespace is { IsGlobalNamespace: false }
129 ? classSymbol.ContainingNamespace.ToDisplayString()
130 : string.Empty;
131
132 return new EntryCandidateModel(
133 classSymbol,
134 classDeclaration,
135 namespaceName,
136 classSymbol.Name,
137 IsPartial(classDeclaration),
138 InheritsFrom(classSymbol, applicationSymbol));
139 }

다음을 참조함 : InheritsFrom(), IsPartial().

다음에 의해서 참조됨 : Initialize().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ DuplicateEntryDescriptor

readonly DiagnosticDescriptor Dreamine.MVVM.Generators.DreamineEntryGenerator.DuplicateEntryDescriptor
staticprivate
초기값:
= new(
id: "DMG003",
title: "Only one entry class is allowed",
messageFormat: "Only one valid [DreamineEntry] class is allowed but '{0}' is also marked as an entry",
category: "Dreamine.MVVM.Generators",
defaultSeverity: DiagnosticSeverity.Error,
isEnabledByDefault: true)

DreamineEntryGenerator.cs 파일의 36 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Emit().

◆ EntryAttributeMetadataName

const string Dreamine.MVVM.Generators.DreamineEntryGenerator.EntryAttributeMetadataName = "Dreamine.MVVM.Attributes.DreamineEntryAttribute"
staticprivate

DreamineEntryGenerator.cs 파일의 17 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Initialize().

◆ EntryMustBePartialDescriptor

readonly DiagnosticDescriptor Dreamine.MVVM.Generators.DreamineEntryGenerator.EntryMustBePartialDescriptor
staticprivate
초기값:
= new(
id: "DMG001",
title: "Entry class must be partial",
messageFormat: "Class '{0}' marked with [DreamineEntry] must be declared partial",
category: "Dreamine.MVVM.Generators",
defaultSeverity: DiagnosticSeverity.Error,
isEnabledByDefault: true)

DreamineEntryGenerator.cs 파일의 20 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Emit().

◆ EntryMustInheritApplicationDescriptor

readonly DiagnosticDescriptor Dreamine.MVVM.Generators.DreamineEntryGenerator.EntryMustInheritApplicationDescriptor
staticprivate
초기값:
= new(
id: "DMG002",
title: "Entry class must inherit Application",
messageFormat: "Class '{0}' marked with [DreamineEntry] must inherit System.Windows.Application",
category: "Dreamine.MVVM.Generators",
defaultSeverity: DiagnosticSeverity.Error,
isEnabledByDefault: true)

DreamineEntryGenerator.cs 파일의 28 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Emit().

◆ WpfApplicationMetadataName

const string Dreamine.MVVM.Generators.DreamineEntryGenerator.WpfApplicationMetadataName = "System.Windows.Application"
staticprivate

DreamineEntryGenerator.cs 파일의 18 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Initialize().


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: