更新:似乎 C# 代码生成问题,我怀疑是出于同样的原因,实际上是一个 ReSharper 问题。但是 TypeScript 问题在 VM 内干净的 Visual Studio 上也仍然存在。
我基于我当前的目标文件将自定义 DSL 编译为 TypeScript 文件,部分基于用于 XAML 的内容和此 stackoverflow帖子中显示的 ANTLR 目标文件作为示例。
DSL 可以很好地编译为 typescript,最终组合的 .js 文件还包含 DSL 编译的代码。但智能感知似乎无法识别生成的 ts 文件 (*.g.ts)。
如果转换为 .cs 编译(而不是 .ts),如果项目中引用了同名的部分类,智能感知似乎也只会拾取生成的类。是因为目标文件中的错误还是智能感知无法拾取非部分生成的类?
使用的目标文件
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="MyTestSampleTask.MyTestTask" AssemblyFile="MyTestSampleTask.dll" />
<PropertyGroup>
<LoadTimeSensitiveTargets>
$(LoadTimeSensitiveTargets);
DesignGenerateMyTestSampleOutput;
</LoadTimeSensitiveTargets>
</PropertyGroup>
<PropertyGroup>
<PrepareResourcesDependsOn>
GenerateMyTestSampleOutput;
$(PrepareResourcesDependsOn)
</PrepareResourcesDependsOn>
</PropertyGroup>
<PropertyGroup>
<CoreCompileDependsOn Condition="'$(BuildingInsideVisualStudio)'=='true'">
DesignGenerateMyTestSampleOutput;
$(CoreCompileDependsOn)
</CoreCompileDependsOn>
</PropertyGroup>
<ItemGroup Condition="'$(BuildingInsideVisualStudio)'=='true'">
<AvailableItemName Include="MyTestSample" />
</ItemGroup>
<Target Name="DesignGenerateMyTestSampleOutput">
<!-- Only if we are not actually performing a compile i.e. we are in design mode -->
<CallTarget Condition="'$(BuildingProject)' != 'true'" Targets="GenerateMyTestSampleOutput" />
</Target>
<Target Name="GenerateMyTestSampleOutput" Inputs="@(MyTestSample)" Outputs="@(MyTestSample->'$(IntermediateOutputPath)%(FileName)%(Extension).g.ts')">
<MyTestTask InputFiles="@(MyTestSample)" OutputFiles="@(MyTestSample->'$(IntermediateOutputPath)%(FileName)%(Extension).g.ts')">
<Output TaskParameter="OutputFiles" ItemName="MyTestOutputFiles" />
</MyTestTask>
<ItemGroup>
<TypeScriptCompile Include="@(MyTestOutputFiles)" />
</ItemGroup>
</Target>
</Project>
附加信息:
我在测试项目中使用的构建任务目前不是很有趣,它只是让 DSL 文件(必须是包含有效标识符的单行)读取它并使用读取的名称生成一个类。
public class BasicConverterTask : ITask
{
public IBuildEngine BuildEngine { get; set; }
public ITaskHost HostObject { get; set; }
[Required]
public ITaskItem[] InputFiles { get; set; }
[Output]
public ITaskItem[] OutputFiles { get; set; }
public bool Execute()
{
for (int i = 0; i < InputFiles.Length; i++)
File.WriteAllText(OutputFiles[i].ItemSpec, ProcessFile(File.ReadAllText(InputFiles[i].ItemSpec)));
return true;
}
private string ProcessFile(string input)
{
var builder = new StringBuilder();
builder.AppendLine("module TsSample {");
builder.AppendFormat("\texport class {0} {{\n", input);
builder.AppendFormat("\t\tpublic print() : string {{ return \"{0}\"; }}\n", input);
builder.AppendLine("\t}");
builder.AppendLine("}");
return builder.ToString();
}
}
结果只是在 obj/[Debug|Release] 中生成了一个非常简单的 ts 文件(例如带有 DSL 内容“MySampleClass”)
module TsSample {
export class MySampleClass {
public print() : string { return "MySampleClass"; }
}
}