类似xml的DSL到Typescript的编译
本文关键字:Typescript 编译 DSL xml 类似 | 更新日期: 2023-09-27 18:13:53
Update:似乎c#代码生成问题,我怀疑是同样的原因,实际上是一个ReSharper问题。但是TypeScript问题在一个干净的Visual Studio中仍然存在。
我目前的目标文件是用来编译自定义DSL到TypeScript文件的,部分是基于XAML和ANTLR目标文件所使用的,在这个stackoverflow帖子中作为一个例子。
DSL可以很好地编译为typescript,并且最终合并的.js文件也包含DSL编译的代码。但是智能感知似乎无法识别生成的ts文件(*.g.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();
}
}
结果只是一个非常简单的ts文件生成在obj/[Debug|Release](例如与DSL内容"MySampleClass")
module TsSample {
export class MySampleClass {
public print() : string { return "MySampleClass"; }
}
}
我想你可能碰到TypeScript语言服务中的文件名限制了。
如果您使用.d.ts
或.ts
文件扩展名,您应该获得自动完成-但我认为您的.g.ts
文件扩展名可能不包括