MSBuild XAML-подобная компиляция DSL в Typescript

Обновление: Кажется, проблема с генерацией кода на C#, которая, как я подозревал, по той же причине, действительно была проблемой ReSharper. Но проблема TypeScript также сохраняется в чистой Visual Studio внутри виртуальной машины.


Я основал свой текущий файл целей для компиляции пользовательского DSL в файле TypeScript частично на том, что используется для XAML, и файл целей ANTLR, показанный в этом сообщении stackru в качестве примера.

DSL прекрасно компилируется в машинописный текст, и последний объединенный файл.js также содержит скомпилированный код DSL. Но intellisense просто не распознает сгенерированный файл ts (*.g.ts).

При преобразовании в.cs-компиляцию (вместо.ts) также создается впечатление, что intellisense выбирает сгенерированный класс, только если в проекте есть частичный класс с тем же именем, на который есть ссылка. Это из-за ошибки в целевых файлах или Intellisense не может выбрать не частично сгенерированные классы?

Файл используемых целей

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

1 ответ

Я думаю, что вы можете столкнуться с ограничением имени файла в языковой службе TypeScript.

Вы должны получить автозаполнение, если вы используете .d.ts или .ts расширение файла - но я думаю, что ваше расширение файла .g.ts может не учитываться для включения.

Другие вопросы по тегам