Skip to content

Commit 5203527

Browse files
Merge pull request #130 from CommunityToolkit/fix/multiple-tabs-in-single-sample
Fixed data from other samples being pulled into single-experiment solutions
2 parents 3fd3214 + d42189a commit 5203527

File tree

4 files changed

+71
-23
lines changed

4 files changed

+71
-23
lines changed

common/CommunityToolkit.Labs.Core.SourceGenerators/ToolkitSampleMetadataGenerator.Sample.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ void Execute(IncrementalValuesProvider<ISymbol> types, bool skipDiagnostics = fa
121121
);
122122

123123
var docFrontMatter = GatherDocumentFrontMatter(ctx, markdownFileData);
124-
124+
125125
if (isExecutingInSampleProject && !skipDiagnostics)
126126
{
127127
ReportSampleDiagnostics(ctx, toolkitSampleAttributeData, optionsPaneAttribute, generatedOptionPropertyData);

common/CommunityToolkit.Labs.Shared/Renderers/ToolkitDocumentationRenderer.xaml.cs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,32 @@ private void SampleListHyperlink_Click(object sender, RoutedEventArgs e)
153153

154154
private static async Task<string> GetDocumentationFileContents(ToolkitFrontMatter metadata)
155155
{
156-
var fileUri = new Uri($"ms-appx:///SourceAssets/{metadata.FilePath}");
156+
// TODO: https://github.com/CommunityToolkit/Labs-Windows/issues/142
157+
// MSBuild uses wildcard to find the files, and the wildcards decide where they end up
158+
// Single experiments use relative paths, the allExperiment head uses absolute paths that grab from all experiments
159+
// The wildcard captures decide the paths. This discrepency is accounted for manually.
160+
// Logic here is the exact same that MSBuild uses to find and include the files we need.
161+
var assemblyName = typeof(ToolkitSampleRenderer).Assembly.GetName().Name;
162+
if (string.IsNullOrWhiteSpace(assemblyName))
163+
throw new InvalidOperationException();
164+
165+
var isAllExperimentHead = assemblyName.StartsWith("CommunityToolkit.Labs.", StringComparison.OrdinalIgnoreCase);
166+
var isProjectTemplateHead = assemblyName.StartsWith("ProjectTemplate");
167+
var isSingleExperimentHead = !isAllExperimentHead && !isProjectTemplateHead;
168+
169+
if (metadata.FilePath is null || string.IsNullOrWhiteSpace(metadata.FilePath))
170+
throw new InvalidOperationException("Missing or malformed path to markdown file. Unable to continue;");
171+
172+
var path = metadata.FilePath;
173+
174+
if (isSingleExperimentHead || isProjectTemplateHead)
175+
{
176+
var experimentName = assemblyName.Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries)[0];
177+
path = path.Split(new[] { $"\\{experimentName}.Sample" }, StringSplitOptions.RemoveEmptyEntries)[1];
178+
path = $"{experimentName}.Sample{path}";
179+
}
180+
181+
var fileUri = new Uri($"ms-appx:///SourceAssets/{path}");
157182

158183
try
159184
{

common/CommunityToolkit.Labs.Shared/Renderers/ToolkitSampleRenderer.xaml.cs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ public UIElement? SampleControlInstance
8989
set => SetValue(SampleControlInstanceProperty, value);
9090
}
9191

92-
9392
/// <summary>
9493
/// The options pane for the sample being displayed.
9594
/// </summary>
@@ -197,10 +196,23 @@ private async Task LoadData()
197196

198197
/// <summary>
199198
/// Compute path to a code file bundled in the app using type information.
200-
/// Assumes file path in project matches namespace.
199+
/// Assumes path to file within the included assembly folder matches the namespace.
201200
/// </summary>
202201
private static string GetRelativePathToFileWithoutExtension(Type type)
203202
{
203+
// TODO: https://github.com/CommunityToolkit/Labs-Windows/issues/142
204+
// MSBuild uses wildcard to find the files, and the wildcards decide where they end up
205+
// Single experiments use relative paths, the allExperiment head uses absolute paths that grab from all experiments
206+
// The wildcard captures decide the paths. This discrepency is accounted for manually.
207+
// Logic here is the exact same that MSBuild uses to find and include the files we need.
208+
var assemblyName = typeof(ToolkitSampleRenderer).Assembly.GetName().Name;
209+
if (string.IsNullOrWhiteSpace(assemblyName))
210+
throw new InvalidOperationException();
211+
212+
var isAllExperimentHead = assemblyName.StartsWith("CommunityToolkit.Labs.", StringComparison.OrdinalIgnoreCase);
213+
var isProjectTemplateHead = assemblyName.StartsWith("ProjectTemplate");
214+
var isSingleExperimentHead = !isAllExperimentHead && !isProjectTemplateHead;
215+
204216
var simpleAssemblyName = type.Assembly.GetName().Name;
205217
var typeNamespace = type.Namespace;
206218

@@ -213,13 +225,16 @@ private static string GetRelativePathToFileWithoutExtension(Type type)
213225
var sampleName = simpleAssemblyName.Replace(".Sample", "");
214226

215227
var folderPath = typeNamespace.Replace(simpleAssemblyName, "").Trim('.').Replace('.', '/');
216-
217228
if (folderPath.Length != 0)
218-
{
219229
folderPath += "/";
220-
}
221230

222-
return $"SourceAssets/{sampleName}/samples/{simpleAssemblyName}/{folderPath}{type.Name}";
231+
if (isSingleExperimentHead || isProjectTemplateHead)
232+
return $"SourceAssets/{simpleAssemblyName}/{folderPath}{type.Name}";
233+
234+
if (isAllExperimentHead)
235+
return $"SourceAssets/{sampleName}/samples/{simpleAssemblyName}/{folderPath}{type.Name}";
236+
237+
throw new InvalidOperationException("Unable to determine if running in a single or all experiment solution.");
223238
}
224239
}
225240
}

common/Labs.Head.props

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,36 +16,44 @@
1616
</ItemGroup>
1717

1818
<ItemGroup>
19-
<ProjectReference Include="$(RepositoryDirectory)common\CommunityToolkit.Labs.Core.SourceGenerators\CommunityToolkit.Labs.Core.SourceGenerators.csproj"
20-
OutputItemType="None" ReferenceOutputAssembly="true" />
19+
<ProjectReference Include="$(RepositoryDirectory)common\CommunityToolkit.Labs.Core.SourceGenerators\CommunityToolkit.Labs.Core.SourceGenerators.csproj" OutputItemType="None" ReferenceOutputAssembly="true" />
2120

2221
<Analyzer Include="$(RepositoryDirectory)common\CommunityToolkit.Labs.Core.SourceGenerators\bin\$(Configuration)\netstandard2.0\CommunityToolkit.Labs.Core.SourceGenerators.dll" />
2322
</ItemGroup>
2423

25-
<ItemGroup Condition="$(MSBuildProjectName.Contains('ProjectTemplate')) == 'false'">
24+
<PropertyGroup>
25+
<!-- See https://github.com/CommunityToolkit/Labs-Windows/issues/142 -->
26+
<IsAllExperimentHead Condition="$(MSBuildProjectName.StartsWith('CommunityToolkit.Labs.')) == 'true'">true</IsAllExperimentHead>
27+
<IsProjectTemplateHead Condition="$(MSBuildProjectName.StartsWith('ProjectTemplate')) == 'true'">true</IsProjectTemplateHead>
28+
<IsSingleExperimentHead Condition="'$(IsAllExperimentHead)' != 'true' AND '$(IsProjectTemplateHead)' != 'true'">true</IsSingleExperimentHead>
29+
</PropertyGroup>
30+
31+
<!-- See https://github.com/CommunityToolkit/Labs-Windows/issues/142 -->
32+
<ItemGroup Condition="'$(IsAllExperimentHead)' == 'true'">
2633
<!-- These are also included in Labs.Samples.props, but added here to workaround https://github.com/unoplatform/uno/issues/2502 -->
27-
<Content Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.md;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.md;$(RepositoryDirectory)\**\SourceAssets\**\*.md" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
28-
<Content Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.xaml" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.xaml;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.xaml;$(RepositoryDirectory)\**\SourceAssets\**\*.xaml" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
34+
<Content Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.md;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.md;$(RepositoryDirectory)\**\SourceAssets\**\*.md" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
35+
<Content Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.xaml" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.xaml;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.xaml;$(RepositoryDirectory)\**\SourceAssets\**\*.xaml" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
2936

3037
<!-- Link/.dat is a workaround for https://github.com/unoplatform/uno/issues/8649 -->
3138
<Content Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.cs" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.cs;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.cs" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension).dat" />
32-
39+
3340
<!-- Include markdown files from all samples so the head can access them in the source generator -->
34-
<AdditionalFiles Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\**\obj\**\*.md;$(RepositoryDirectory)**\**\samples\**\bin\**\*.md"/>
41+
<AdditionalFiles Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\**\obj\**\*.md;$(RepositoryDirectory)**\**\samples\**\bin\**\*.md"/>
3542
</ItemGroup>
3643

37-
<ItemGroup Condition="$(MSBuildProjectName.Contains('ProjectTemplate')) == 'true'">
44+
<!-- See https://github.com/CommunityToolkit/Labs-Windows/issues/142 -->
45+
<ItemGroup Condition="'$(IsSingleExperimentHead)' == 'true' or '$(IsProjectTemplateHead)' == 'true'">
3846
<!-- These are also included in Labs.Samples.props, but added here to workaround https://github.com/unoplatform/uno/issues/2502 -->
39-
<Content Include="$(RepositoryDirectory)template\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.md;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.md;$(RepositoryDirectory)\**\SourceAssets\**\*.md" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
40-
<Content Include="$(RepositoryDirectory)template\**\samples\*.Sample\**\*.xaml" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.xaml;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.xaml;$(RepositoryDirectory)\**\SourceAssets\**\*.xaml" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
47+
<Content Include="$(MSBuildProjectDirectory)\..\*.Sample\**\*.md" Exclude="$(MSBuildProjectDirectory)\..\*.Sample\obj\**\*.md;$(MSBuildProjectDirectory)\..\*.Sample\bin\**\*.md;$(MSBuildProjectDirectory)\..\**\SourceAssets\**\*.md" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
48+
<Content Include="$(MSBuildProjectDirectory)\..\*.Sample\**\*.xaml" Exclude="$(MSBuildProjectDirectory)\..\*.Sample\obj\**\*.xaml;$(MSBuildProjectDirectory)\..\*.Sample\bin\**\*.xaml;$(MSBuildProjectDirectory)\..\**\SourceAssets\**\*.xaml" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
4149

4250
<!-- Link/.dat is a workaround for https://github.com/unoplatform/uno/issues/8649 -->
43-
<Content Include="$(RepositoryDirectory)template\**\samples\*.Sample\**\*.cs" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.cs;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.cs" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension).dat" />
44-
45-
<!-- Include markdown files from al lsamples so the head can access them in the source generator -->
46-
<AdditionalFiles Include="$(RepositoryDirectory)template\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.md;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.md"/>
51+
<Content Include="$(MSBuildProjectDirectory)\..\*.Sample\**\*.cs" Exclude="$(MSBuildProjectDirectory)\..\*.Sample\obj\**\*.cs;$(MSBuildProjectDirectory)\..\*.Sample\bin\**\*.cs" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension).dat" />
52+
53+
<!-- Include markdown files from all samples so the head can access them in the source generator -->
54+
<AdditionalFiles Include="$(MSBuildProjectDirectory)\..\*.Sample\**\*.md" Exclude="$(MSBuildProjectDirectory)\..\**\obj\**\*.md;$(MSBuildProjectDirectory)\..\**\bin\**\*.md"/>
4755
</ItemGroup>
48-
56+
4957
<PropertyGroup>
5058
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
5159
</PropertyGroup>

0 commit comments

Comments
 (0)