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
может не учитываться для включения.