UNPKG

4.21 kBJavaScriptView Raw
1var utils = require("../utils");
2
3/**
4 * Enrich generated data from signatures of source files (if found).
5 * Currently enriching only method meta object and hasshes if method is async.
6 * @param generatedSignature
7 * @param sourceSignatures
8 * @param logger
9 * @constructor
10 */
11
12var CODE_ELEMENT_TYPES = {
13 BRANCH: "branch",
14 METHOD: "method"
15};
16function SourceDataEnricher(generatedSignature, sourceSignatures, logger) {
17 this.generatedSignature = generatedSignature;
18 this.sourceSignatures = sourceSignatures;
19 this.logger = logger;
20}
21
22/**
23 * Iterate over generated and source methods, find match by source position and enrich method data.
24 */
25SourceDataEnricher.prototype.enrichData = function(){
26 var context = this;
27 this.sourceSignatures.forEach(function (sourceSig) {
28 if(!sourceSig) {
29 context.logger.error("Source signature is undefined, skipping enrichment");
30 return;
31 }
32 var sourcePositionMap = context.generatedSignature.sourcePositionMappers[sourceSig.absolutePath];
33 context.enrichMethods(sourcePositionMap, sourceSig);
34 context.enrichBranches(sourcePositionMap, sourceSig);
35 })
36}
37
38SourceDataEnricher.prototype.enrichMethods = function(sourcePositionMap, sourceSig) {
39 var context = this;
40 var generatedMethodsArray = context.generatedSignature.methods;
41 var sourceMethodsArray = sourceSig.methods;
42 this.enrichProcedure(sourcePositionMap.getMethodsPosition(), sourceSig, generatedMethodsArray, sourceMethodsArray, sourcePositionMap,
43 sourceSig.positionToMethodMap,CODE_ELEMENT_TYPES.METHOD);
44}
45
46SourceDataEnricher.prototype.enrichBranches = function(sourcePositionMap, sourceSig) {
47 var context = this;
48 var generatedBranchArray = context.generatedSignature.branches;
49 var sourceBranchesArray = sourceSig.branches;
50 this.enrichProcedure(sourcePositionMap.getBranchesPosition(), sourceSig, generatedBranchArray, sourceBranchesArray, sourcePositionMap,
51 sourceSig.positionToBranchMap, CODE_ELEMENT_TYPES.BRANCH);
52}
53
54SourceDataEnricher.prototype.handleAutoGeneratedElement = function (elementType, position, sourceSig, generatedElement) {
55 this.logger.info("Couldn't find %s at position '%s' in file '%s', but it got generate as %s." +
56 "marked as auto generate code", elementType, position, sourceSig.absolutePath, elementType);
57 generatedElement.techSpecificInfo["autoGenerated"] = true;
58}
59
60SourceDataEnricher.prototype.enrichProcedure= function(srcPositionsArr, sourceSig, genElementsArr, srcElementsArr,
61 srcPositionToGenElementIdx, srcPositionToSrcElementIdx, codeElementType) {
62 var context = this;
63 srcPositionsArr.forEach(function (srcPosition) {
64 var sourceElementIndex = srcPositionToSrcElementIdx[srcPosition];
65 var getGenIdxMethod = codeElementType === CODE_ELEMENT_TYPES.METHOD ? srcPositionToGenElementIdx.getMethodIndex : srcPositionToGenElementIdx.getBranchIndex;
66 var generatedElementIndex = getGenIdxMethod.call(srcPositionToGenElementIdx, srcPosition);
67 var generatedElement = genElementsArr[generatedElementIndex];
68 var sourceElement = srcElementsArr[sourceElementIndex];
69 if (generatedElement == null) {
70 context.logger.warn("%s with source position '%s' in file '%s', is null", codeElementType, srcPosition, context.generatedSignature.absolutePath);
71 }
72 else if (sourceElement == null) {
73 context.handleAutoGeneratedElement(codeElementType, srcPosition, sourceSig, generatedElement);
74 }
75 else if(codeElementType == CODE_ELEMENT_TYPES.METHOD) {
76 updateMethodInfo(generatedElement, sourceElement);
77 }
78 })
79}
80
81function updateMethodInfo(generatedMethod, sourceMethod) {
82 generatedMethod.meta = utils.cloneObject(sourceMethod.meta);
83 generatedMethod.techSpecificInfo = utils.cloneObject(sourceMethod.techSpecificInfo);
84 if (sourceMethod.techSpecificInfo.isAsync) {
85 generatedMethod.srcData.hash = sourceMethod.generatedData.hash;
86 generatedMethod.srcData.sigHash = sourceMethod.generatedData.sigHash;
87 }
88}
89module.exports = SourceDataEnricher;
\No newline at end of file