Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | 1x 1x 1x 1x 1x 1x 1x 1x 29x 29x 29x 29x 29x 29x 29x 74x 28x 28x 28x 17x 17x 28x 28x 28x 1x 1x 1x 1x 1x 1x 28x 5x 5x 5x 5x 5x 5x 5x 22x 28x 28x 28x 22x 5x 5x 4x 4x 4x 4x 5x 1x 1x 1x 1x 1x 22x 17x 17x 17x 17x 17x 17x 28x 74x 46x 46x 46x 46x 46x 74x 29x 29x 29x 1x 1x | import {AbstractType, IRegistry} from "..";
import {IStructureComponent, StructureType, UnknownType, VoidType} from "../abap/types/basic";
import {DDIC} from "../ddic";
import {ParsedDataDefinition} from "../objects";
export class CDSDetermineTypes {
public parseType(reg: IRegistry, parsedData: ParsedDataDefinition, ddlsName: string): AbstractType {
const ddic = new DDIC(reg);
if (parsedData?.fields.length === 0) {
return VoidType.get("DDLS:todo");
} else {
const components: IStructureComponent[] = [];
for (const f of parsedData?.fields || []) {
if (f.prefix !== "") {
const prefixUpper = f.prefix.toUpperCase();
let source = parsedData.sources.find((s) => s.as?.toUpperCase() === prefixUpper);
if (source?.name === undefined) {
source = parsedData.sources.find((s) => s.name.toUpperCase() === prefixUpper);
}
if (source?.name === undefined
&& (parsedData.associations.find((s) => s.name.toUpperCase() === prefixUpper)
|| parsedData.associations.find((s) => s.as?.toUpperCase() === prefixUpper))) {
components.push({
name: f.name,
type: VoidType.get("DDLS:association"),
});
continue;
}
if (source?.name === undefined) {
if (prefixUpper.startsWith("_")) {
components.push({
name: f.name,
type: VoidType.get("DDLS:association"),
});
continue;
}
components.push({
name: f.name,
type: new UnknownType("CDS parser error, unknown source, " + f.name + ", " + ddlsName),
});
continue;
}
const nameInSource = f.nameInSource ?? f.name;
const lookup = ddic.lookupTableOrView(source.name);
if (lookup.type) {
if (lookup.type instanceof StructureType) {
const type = lookup.type.getComponentByName(nameInSource);
if (type) {
components.push({
name: f.name,
type: type,
});
} else {
components.push({
name: f.name,
type: new UnknownType(nameInSource + " not found in " + source.name + ", CDSDetermineTypes"),
});
}
} else {
// its void or unknown
components.push({
name: f.name,
type: lookup.type,
});
}
} else if (reg.inErrorNamespace(source.name)) {
components.push({
name: f.name,
type: new UnknownType(source.name + " not found, CDSDetermineTypes"),
});
} else {
components.push({
name: f.name,
type: VoidType.get(source.name),
});
}
} else {
components.push({
name: f.name,
type: VoidType.get("DDLS:fieldname:" + ddlsName),
});
}
}
return new StructureType(components, parsedData.definitionName, parsedData.definitionName, parsedData.description);
}
}
} |