Skip to content

Commit

Permalink
rpc support and typings update
Browse files Browse the repository at this point in the history
  • Loading branch information
AidasPa committed Mar 13, 2021
1 parent 2437639 commit 98f53ad
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 26 deletions.
13 changes: 10 additions & 3 deletions cli/stubs/typings.stub
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
type UPROPERTYParam = null;
type UFUNCTIONParam = null;
type KEYBINDParam = 0 | 1;

declare const EditAnywhere: UPROPERTYParam = null;
declare const VisibleAnywhere: UPROPERTYParam = null;
declare const EditAnywhere: UPROPERTYParam;
declare const VisibleAnywhere: UPROPERTYParam;

declare const BindAxis: KEYBINDParam = 0;
declare const BindAction: KEYBINDParam = 1;
declare const IE_PRESSED: KEYBINDParam = 0;
declare const IE_RELEASED: KEYBINDParam = 1;

declare const Server: UFUNCTIONParam;
declare const Client: UFUNCTIONParam;
declare const Reliable: UFUNCTIONParam;
declare const Unreliable: UFUNCTIONParam;
declare const NetMulticast: UFUNCTIONParam;

declare const UCLASS = (): Function => (): void => {};
declare const UPROPERTY = (...args: UPROPERTYParam[]): Function => (): void => {};
declare const UFUNCTION = (...args: UPROPERTYParam[]): Function => (): void => {};
declare const UFUNCTION = (...args: UFUNCTIONParam[]): Function => (): void => {};
declare const KEYBIND = (type: KEYBINDParam, action: string, event: ?KEYBINDParam = 0): Function => (): void => {};

declare type float = number;
71 changes: 51 additions & 20 deletions compiler/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ module.exports = (code) => {
const lines = code.split('\n');

const propertyBag = [];
// because TS removes comments where it shouldn't and UnrealJS needs them
const thingsToReplaceAfterTypescript = [];

let constructorLine = null;
Expand All @@ -16,7 +17,20 @@ module.exports = (code) => {
let keybindConfiguration = null;
let keybindMethodLine = null;

let uFunctionConfiguration = null;
let uFunctionMethodLine = null;

const transformedCodeArray = lines.map((line, i) => {
if (i === uFunctionMethodLine) {
uFunctionMethodLine = null;
const [
result,
whatToReplaceAfterTypescript,
] = parser.formatUFunctionMethod(line, uFunctionConfiguration);

thingsToReplaceAfterTypescript.push(whatToReplaceAfterTypescript);
return result;
}
if (i === keybindMethodLine) {
keybindMethodLine = null;
const [result, whatToReplaceAfterTypescript] = parser.formatKeybindMethod(
Expand All @@ -36,7 +50,7 @@ module.exports = (code) => {
}
if (
new RegExp(`new ${className}`).test(line)
|| new RegExp(`export .*? ${className}`).test(line)
|| new RegExp(`export.*?${className}`).test(line)
) {
if (firstClassReferenceLine === null) {
firstClassReferenceLine = i - 1;
Expand Down Expand Up @@ -64,6 +78,21 @@ module.exports = (code) => {
if (decorator === 'UCLASS') {
return '';
}
if (decorator === 'UFUNCTION') {
uFunctionMethodLine = i + 1;

// check what method are we ufunction-ing
const nextLine = lines[i + 1];
const [methodName, args] = parser.parseTypescriptMethod(nextLine);
uFunctionConfiguration = {
method: methodName,
args,
line: i + 1,
decoratorArguments,
};

return '';
}
if (decorator === 'KEYBIND') {
keybindMethodLine = i + 1;

Expand Down Expand Up @@ -111,14 +140,12 @@ module.exports = (code) => {
);
classHash = newClassHash;

// let times = 0;
const replacedClassReferencesAndSuperCall = processedCode.map((line) => {
if (new RegExp(className).test(line) && (/new/.test(line) || /export/.test(line))) {
console.log(line);
// if (times > 0) {
return line.replace(className, `${className}_${classHash}`);
// }
// times += 1;
if (
new RegExp(className).test(line)
&& (/new/.test(line) || /export/.test(line))
) {
return line.replace(className, `${className}_${classHash}`);
}

if (/super\(.*\)/.test(line) && replaceSuper) {
Expand All @@ -132,21 +159,25 @@ module.exports = (code) => {
replacedClassReferencesAndSuperCall.join('\n'),
);

const replacedJavascript = compiledJavascript.split('\n').map((line) => {
const noSpaces = line.replace(/ /g, '').replace(/\r/g, '');
const replacedJavascript = compiledJavascript
.split('\n')
.map((line) => {
const noSpaces = line.replace(/ /g, '').replace(/\r/g, '');

let result = line;
let result = line;

// eslint-disable-next-line consistent-return
thingsToReplaceAfterTypescript.forEach(([target, replacement]) => {
if (target === noSpaces) {
// eslint-disable-next-line no-return-assign
return result = replacement;
}
});
// eslint-disable-next-line consistent-return
thingsToReplaceAfterTypescript.forEach(([target, replacement]) => {
// console.log(target);
if (target === noSpaces) {
// eslint-disable-next-line no-return-assign
return (result = replacement);
}
});

return result;
}).join('\n');
return result;
})
.join('\n');

return replacedJavascript.replace(
'Object.defineProperty(exports, "__esModule", { value: true });',
Expand Down
39 changes: 36 additions & 3 deletions compiler/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,45 @@ const buildCompiledClass = (className) => {
};

module.exports = {
formatUFunctionMethod(line, configuration) {
const noSpaces = line.replace(/ /g, '');
let result = noSpaces;

configuration.args.forEach((arg) => {
if (arg.name !== '') {
result = result.replace(
`${arg.name}:${arg.type}`,
`${arg.name} /*${arg.type}*/`,
);
}
});

const rpcArguments = configuration.decoratorArguments.reduce(
(acc, arg) => (acc === '' ? `${arg}` : `${acc}+${arg}`),
'',
);

const replaceWhat = result.replace(/ /g, '');
result = result.replace(')', `) /*${rpcArguments}*/`);

return [result, [replaceWhat, result]];
},
formatKeybindMethod(line, configuration) {
const noSpaces = line.replace(/ /g, '');
let result;

configuration.args.forEach((arg) => {
result = noSpaces.replace(`${arg.name}:${arg.type}`, `${arg.name} /*${arg.type}*/`);
result = noSpaces.replace(
`${arg.name}:${arg.type}`,
`${arg.name} /*${arg.type}*/`,
);
});

const [bindWhat, methodName, event = false] = configuration.decoratorArguments;
const [
bindWhat,
methodName,
event = false,
] = configuration.decoratorArguments;

let bindType;
if (bindWhat === 'BindAxis') {
Expand All @@ -49,7 +79,10 @@ module.exports = {
const cleanMethodName = methodName.replace(/'/g, '').replace(/"/g, '');

const replaceWhat = result.replace(/ /g, '');
result = result.replace(')', `) /*${bindType}[${cleanMethodName}, ${additionalArguments}]*/`);
result = result.replace(
')',
`) /*${bindType}[${cleanMethodName}, ${additionalArguments}]*/`,
);

return [result, [replaceWhat, result]];
},
Expand Down

0 comments on commit 98f53ad

Please sign in to comment.