类似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)。

如果转换为。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();
    }
}

结果只是一个非常简单的ts文件生成在obj/[Debug|Release](例如与DSL内容"MySampleClass")

module TsSample {
    export class MySampleClass {
        public print() : string { return "MySampleClass"; }
    }
}

类似xml的DSL到Typescript的编译

我想你可能碰到TypeScript语言服务中的文件名限制了。

如果您使用.d.ts.ts文件扩展名,您应该获得自动完成-但我认为您的.g.ts文件扩展名可能不包括