Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed data from other samples being pulled into single-experiment solutions #130

Merged
merged 5 commits into from
Jun 6, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ void Execute(IncrementalValuesProvider<ISymbol> types, bool skipDiagnostics = fa
);

var docFrontMatter = GatherDocumentFrontMatter(ctx, markdownFileData);

if (isExecutingInSampleProject && !skipDiagnostics)
{
ReportSampleDiagnostics(ctx, toolkitSampleAttributeData, optionsPaneAttribute, generatedOptionPropertyData);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,32 @@ private void SampleListHyperlink_Click(object sender, RoutedEventArgs e)

private static async Task<string> GetDocumentationFileContents(ToolkitFrontMatter metadata)
{
var fileUri = new Uri($"ms-appx:///SourceAssets/{metadata.FilePath}");
// TODO: https://github.com/CommunityToolkit/Labs-Windows/issues/142
// MSBuild uses wildcard to find the files, and the wildcards decide where they end up
// Single experiments use relative paths, the allExperiment head uses absolute paths that grab from all experiments
// The wildcard captures decide the paths. This discrepency is accounted for manually.
// Logic here is the exact same that MSBuild uses to find and include the files we need.
var assemblyName = typeof(ToolkitSampleRenderer).Assembly.GetName().Name;
if (string.IsNullOrWhiteSpace(assemblyName))
throw new InvalidOperationException();

var isAllExperimentHead = assemblyName.StartsWith("CommunityToolkit.Labs.", StringComparison.OrdinalIgnoreCase);
var isProjectTemplateHead = assemblyName.StartsWith("ProjectTemplate");
var isSingleExperimentHead = !isAllExperimentHead && !isProjectTemplateHead;

if (metadata.FilePath is null || string.IsNullOrWhiteSpace(metadata.FilePath))
throw new InvalidOperationException("Missing or malformed path to markdown file. Unable to continue;");

var path = metadata.FilePath;

if (isSingleExperimentHead || isProjectTemplateHead)
{
var experimentName = assemblyName.Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries)[0];
path = path.Split(new[] { $"\\{experimentName}.Sample" }, StringSplitOptions.RemoveEmptyEntries)[1];
path = $"{experimentName}.Sample{path}";
}
Arlodotexe marked this conversation as resolved.
Show resolved Hide resolved

var fileUri = new Uri($"ms-appx:///SourceAssets/{path}");

try
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ public UIElement? SampleControlInstance
set => SetValue(SampleControlInstanceProperty, value);
}


/// <summary>
/// The options pane for the sample being displayed.
/// </summary>
Expand Down Expand Up @@ -197,10 +196,23 @@ private async Task LoadData()

/// <summary>
/// Compute path to a code file bundled in the app using type information.
/// Assumes file path in project matches namespace.
/// Assumes path to file within the included assembly folder matches the namespace.
/// </summary>
private static string GetRelativePathToFileWithoutExtension(Type type)
{
// TODO: https://github.com/CommunityToolkit/Labs-Windows/issues/142
// MSBuild uses wildcard to find the files, and the wildcards decide where they end up
// Single experiments use relative paths, the allExperiment head uses absolute paths that grab from all experiments
// The wildcard captures decide the paths. This discrepency is accounted for manually.
// Logic here is the exact same that MSBuild uses to find and include the files we need.
var assemblyName = typeof(ToolkitSampleRenderer).Assembly.GetName().Name;
if (string.IsNullOrWhiteSpace(assemblyName))
throw new InvalidOperationException();

var isAllExperimentHead = assemblyName.StartsWith("CommunityToolkit.Labs.", StringComparison.OrdinalIgnoreCase);
var isProjectTemplateHead = assemblyName.StartsWith("ProjectTemplate");
var isSingleExperimentHead = !isAllExperimentHead && !isProjectTemplateHead;

var simpleAssemblyName = type.Assembly.GetName().Name;
var typeNamespace = type.Namespace;

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

var folderPath = typeNamespace.Replace(simpleAssemblyName, "").Trim('.').Replace('.', '/');

if (folderPath.Length != 0)
{
folderPath += "/";
}

return $"SourceAssets/{sampleName}/samples/{simpleAssemblyName}/{folderPath}{type.Name}";
if (isSingleExperimentHead || isProjectTemplateHead)
return $"SourceAssets/{simpleAssemblyName}/{folderPath}{type.Name}";

if (isAllExperimentHead)
return $"SourceAssets/{sampleName}/samples/{simpleAssemblyName}/{folderPath}{type.Name}";
Arlodotexe marked this conversation as resolved.
Show resolved Hide resolved

throw new InvalidOperationException("Unable to determine if running in a single or all experiment solution.");
}
}
}
38 changes: 23 additions & 15 deletions common/Labs.Head.props
Original file line number Diff line number Diff line change
Expand Up @@ -16,36 +16,44 @@
</ItemGroup>

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

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

<ItemGroup Condition="$(MSBuildProjectName.Contains('ProjectTemplate')) == 'false'">
<PropertyGroup>
<!-- See https://github.com/CommunityToolkit/Labs-Windows/issues/142 -->
<IsAllExperimentHead Condition="$(MSBuildProjectName.StartsWith('CommunityToolkit.Labs.')) == 'true'">true</IsAllExperimentHead>
<IsProjectTemplateHead Condition="$(MSBuildProjectName.StartsWith('ProjectTemplate')) == 'true'">true</IsProjectTemplateHead>
<IsSingleExperimentHead Condition="'$(IsAllExperimentHead)' != 'true' AND '$(IsProjectTemplateHead)' != 'true'">true</IsSingleExperimentHead>
</PropertyGroup>

<!-- See https://github.com/CommunityToolkit/Labs-Windows/issues/142 -->
<ItemGroup Condition="'$(IsAllExperimentHead)' == 'true'">
<!-- These are also included in Labs.Samples.props, but added here to workaround https://github.com/unoplatform/uno/issues/2502 -->
<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)"/>
<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)"/>
<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)"/>
<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)"/>

<!-- Link/.dat is a workaround for https://github.com/unoplatform/uno/issues/8649 -->
<Content Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.cs" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.cs;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.cs" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension).dat" />

<!-- Include markdown files from all samples so the head can access them in the source generator -->
<AdditionalFiles Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\**\obj\**\*.md;$(RepositoryDirectory)**\**\samples\**\bin\**\*.md"/>
<AdditionalFiles Include="$(RepositoryDirectory)labs\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\**\obj\**\*.md;$(RepositoryDirectory)**\**\samples\**\bin\**\*.md"/>
</ItemGroup>

<ItemGroup Condition="$(MSBuildProjectName.Contains('ProjectTemplate')) == 'true'">
<!-- See https://github.com/CommunityToolkit/Labs-Windows/issues/142 -->
<ItemGroup Condition="'$(IsSingleExperimentHead)' == 'true' or '$(IsProjectTemplateHead)' == 'true'">
Arlodotexe marked this conversation as resolved.
Show resolved Hide resolved
<!-- These are also included in Labs.Samples.props, but added here to workaround https://github.com/unoplatform/uno/issues/2502 -->
<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)"/>
<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)"/>
<Content Include="$(MSBuildProjectDirectory)\..\*.Sample\**\*.md" Exclude="$(MSBuildProjectDirectory)\..\*.Sample\obj\**\*.md;$(MSBuildProjectDirectory)\..\*.Sample\bin\**\*.md;$(MSBuildProjectDirectory)\..\**\SourceAssets\**\*.md" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>
<Content Include="$(MSBuildProjectDirectory)\..\*.Sample\**\*.xaml" Exclude="$(MSBuildProjectDirectory)\..\*.Sample\obj\**\*.xaml;$(MSBuildProjectDirectory)\..\*.Sample\bin\**\*.xaml;$(MSBuildProjectDirectory)\..\**\SourceAssets\**\*.xaml" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension)"/>

<!-- Link/.dat is a workaround for https://github.com/unoplatform/uno/issues/8649 -->
<Content Include="$(RepositoryDirectory)template\**\samples\*.Sample\**\*.cs" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.cs;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.cs" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension).dat" />
<!-- Include markdown files from al lsamples so the head can access them in the source generator -->
<AdditionalFiles Include="$(RepositoryDirectory)template\**\samples\*.Sample\**\*.md" Exclude="$(RepositoryDirectory)**\**\samples\*.Sample\obj\**\*.md;$(RepositoryDirectory)**\**\samples\*.Sample\bin\**\*.md"/>
<Content Include="$(MSBuildProjectDirectory)\..\*.Sample\**\*.cs" Exclude="$(MSBuildProjectDirectory)\..\*.Sample\obj\**\*.cs;$(MSBuildProjectDirectory)\..\*.Sample\bin\**\*.cs" Link="SourceAssets/%(RecursiveDir)%(FileName)%(Extension).dat" />

<!-- Include markdown files from all samples so the head can access them in the source generator -->
<AdditionalFiles Include="$(MSBuildProjectDirectory)\..\*.Sample\**\*.md" Exclude="$(MSBuildProjectDirectory)\..\**\obj\**\*.md;$(MSBuildProjectDirectory)\..\**\bin\**\*.md"/>
</ItemGroup>

<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>
Expand Down