Skip to content
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}";
}

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}";

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'">
<!-- 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