Как писать код, который пишет код

на TS

Валерий Кузьмин, СКБ Контур

Новосибирск, 2017

Kontur.Recognition

Проблема - надо писать 2 раза

  • Data Transfer Object
  • Валидации

Подходы

JS

JS

C#

C#

JS

node.js

edge.js

codegen

Open-source решения

  • JSIL - все что угодно, страшный JS
  • NetJS - с ограничениями, TS
    • namespaces
    • overloads
    • async
    • RegEx named groups
private static List<ValidationResult> ValidateInn(string inn) {
    List<ValidationResult> results = new List<ValidationResult>();
    bool isIndividual = InnKppHelper.IsInnForIndividual(inn);
    bool isInnForLegalEntity = InnKppHelper
        .IsInnForLegalEntity(inn);
    if (isIndividual || isInnForLegalEntity) {
	if (!InnKppHelper.IsInnChecksumValid(inn)) {
	    results.Add(new ValidationResult {
		Field = MetaField.Inn,
		Code = ValidationErrorLevel.Error,
		Message = 
                    "Неверная контрольная сумма ИНН"
	    });
	}
    }
}

На входе

private static ValidateInn(inn: string): List<ValidationResult> {
    var list: List<ValidationResult> = new List<ValidationResult>();
    var flag: boolean = InnKppHelper.IsInnForIndividual(inn);
    var flag2: boolean = InnKppHelper
        .IsInnForLegalEntity(inn);
    if (flag || flag2) {
        if (!InnKppHelper.IsInnChecksumValid(inn)) {
            var arg_5D_0: List<ValidationResult> = list;
            var validationResult: ValidationResult = 
                new ValidationResult();
            validationResult.Message = 
                "Неверная контрольная сумма ИНН";
            arg_5D_0.Add(validationResult);
        }
    }
}

На выходе

Как это работает

Krec.Isomorphic.dll

ILSpy

NRefactory

AST (C#)

C# code

Как это работает

AST (C#)

AST (TS)

CsToTs

Krec.Isomorphic.ts

TsOutputVisitor

Как это работает

Krec.Isomorphic.ts

Готовая сборка

Нужен Runtime!

Как это работает

Krec.Isomorphic.ts

guid.ts

mscorlib.ts

Готовая сборка

Процесс сборки

C#

DLL

TypeScript

JS

PROFIT!

NetJS

webpack

msbuild

???

Процесс сборки

C#

DLL

TypeScript

Fixed TS

JS

PROFIT!

NetJS

webpack

gulp

msbuild

???

2

1

(1) webpack: референсы

///<reference path='mscorlib.ts'/>

... my ts code ...
import {
    NObject,
    Exception,
    NBoolean,
    ...
} from './mscorlib.ts';

(1) webpack: экспорты

class DocumentExtensions extends NObject ...
export class DocumentExtensions 
    extends NObject ...
+ enum, interface

(2) netjs: mscorlib.ts

class NString {
...
    static TrimEnd(str: string, trimChars: number[]): string
    {
	throw new NotImplementedException();
    }
...
}

(2) netjs: ES3

class Person {
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}
class Person extends NObject {
    name: string;
    SetName(value: string): void
    {
        this.name = value;
    }
    GetName(): string
    {
        return this.name;
    }
}

tsc.exe -t ES3 mscorlib.es3.ts Library.ts --out Library.js

В итоге:

  • Кода стало меньше
  • Писать на JS сильно проще
  • Писать на C# чуть сложнее
  • Общая логика синхронизирована

Спасибо за внимание!

Вопросы?

  • http://bit.ly/netjs-at-novosib
  • https://github.com/kontur-recognition/Netjs

malcoriel@gmail.com

malcoriel

netjs-at-novosib

By Valeriy Kuzmin

netjs-at-novosib

  • 791