0

更新:似乎 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"; }
    }
}
4

1 回答 1

0

我认为您可能遇到了 TypeScript 语言服务中的文件名限制。

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

于 2014-07-22T10:54:57.643 回答