interpret-dubbo2js
Version:
apache dubbo & dubbo-js interpret java-jar file to typescript files
171 lines (170 loc) • 6.01 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
const debug_1 = __importDefault(require("debug"));
const log = debug_1.default('j2t:core:ast-parse-util');
/**
* java 类型映射到TS中的值;;
* @type {{String: string; Integer: string; Integer: string}}
*
* eg:
*
*
*/
const javaType2JSMap = {
'java.lang.String': 'string',
'java.lang.Object': 'Object',
'java.lang.Integer': 'number',
'java.lang.int': 'number',
'java.lang.short': 'number',
'java.lang.Short': 'number',
'java.lang.long': 'number',
'java.lang.Long': 'number',
'java.lang.double': 'number',
'java.lang.Double': 'number',
'java.lang.Float': 'number',
'java.lang.float': 'number',
'java.lang.Void': 'void',
'java.lang.Boolean': 'boolean',
'java.lang.boolean': 'boolean',
'java.lang.char': 'string',
'java.lang.chars': 'string',
'java.lang.Character': 'string',
'java.lang.byte': 'byte',
'java.lang.Byte': 'byte',
'java.util.Set': 'Array',
'java.util.LinkedHashSet': 'Array',
'java.util.List': 'Array',
'java.util.Collection': 'Array',
'java.util.Date': 'Date',
'java.util.Map': '{[name: ${nameType}]: ${value}}',
'java.util.HashMap': '{[name: ${nameType}]: ${value}}',
'java.math.BigDecimal': '{value:string}',
};
/**
* 获取field的类型转换eg:
* java.lang.String=>string;
* java.util.List<String>=>string[];
*
* @param {IJFieldPropers} typePropers
* @param {ITypeSearch} typeOptions
* @returns {string}
*/
async function jType2Ts(typePropers, typeOptions) {
let result = '';
//是否是类泛型的定义
if (!typePropers) {
throw new Error('typePropers为空');
}
if (typeOptions.isTypeParam(typePropers.name)) {
return typePropers.name;
}
else if (typePropers.isArray) {
let subType = await jType2Ts(typePropers.elementType, typeOptions);
return `${subType}[]`;
}
else if (typePropers.name === 'java.lang.Enum') {
//枚举类型处理
let enumClassPath = typePropers.typeArgs[0].type.name;
return classPath2TypeName(enumClassPath, typeOptions);
}
else if (typePropers.name === 'java.util.Map' &&
typePropers.typeArgs.length === 0) {
return 'any'; //直接返回any
}
else if (typePropers.typeArgs && typePropers.typeArgs.length > 0) {
//泛型处理
let type = await classPath2TypeName(typePropers.name, typeOptions);
if (typePropers.name === 'java.util.Map') {
let nameType = 'any';
if (typePropers.typeArgs[0]) {
if (!typePropers.typeArgs[0].isWildcard) {
nameType = await jType2Ts(typePropers.typeArgs[0].type, typeOptions);
}
}
let valueType = 'any';
if (typePropers.typeArgs[1]) {
if (!typePropers.typeArgs[1].isWildcard) {
valueType = await jType2Ts(typePropers.typeArgs[1].type, typeOptions);
}
}
result = type
.replace('${nameType}', nameType)
.replace('${value}', valueType);
}
else if (type === 'any') {
return 'any';
}
else {
let subTypes = [];
for (var i = 0, iLen = typePropers.typeArgs.length; i < iLen; i++) {
var subItem = typePropers.typeArgs[i];
if (!subItem.isWildcard) {
subTypes.push(await jType2Ts(subItem.type, typeOptions));
}
else {
subTypes.push('any');
}
}
result = `${type}<${subTypes.join(',')}>`;
}
}
else {
result = await classPath2TypeName(typePropers.name, typeOptions);
}
log('获取变量的类型:', typePropers, '==>', result);
return result;
}
exports.jType2Ts = jType2Ts;
/**
* 通过java类路径找到typescript中相对应的文件
* 策略, 先从基础类型中找,如果找不到从环境中找.再找不到抛错;
* eg:
* java.lang.String => string,
* java.util.Date => Date,
* java.util.Map => {[name: ${nameType}]: ${value}},
* java.util.HashMap => {[name: ${nameType}]: ${value}},
* java.math.BigDecimal => {value:string}
*
* com.qianmi.pc.api.d2c.item.pojo.D2cGoodsSort => D2cGoodsSort
*
*/
async function classPath2TypeName(classPath, typeOptions) {
let result = javaType2JSMap[classPath];
if (result) {
return result;
}
else if (typeOptions.hasAst(classPath)) {
let denpendItem = await typeOptions.addDenpend(classPath);
if (denpendItem) {
return denpendItem.importName;
}
else {
console.warn('warning: not find class Type for :' + classPath);
return 'any';
}
}
else {
return 'any';
// throw new Error(`未找到类${classPath},在typescript中的信息; `);
}
}
exports.classPath2TypeName = classPath2TypeName;