diff --git a/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/ServiceToOpenAPIMapper.java b/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/ServiceToOpenAPIMapper.java index 737deb023..10374e881 100644 --- a/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/ServiceToOpenAPIMapper.java +++ b/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/ServiceToOpenAPIMapper.java @@ -202,7 +202,8 @@ public static OASResult generateOAS(OASGenerationMetaInfo oasGenerationMetaInfo) // 03. Filter path and component sections in OAS. // Generate openApi string for the mentioned service name. convertServiceToOpenAPI(serviceDefinition, openapi, semanticModel, moduleMemberVisitor, diagnostics); - ConstraintMapper constraintMapper = new ConstraintMapper(openapi, moduleMemberVisitor, diagnostics); + ConstraintMapper constraintMapper = new ConstraintMapper(openapi, moduleMemberVisitor, semanticModel, + diagnostics); constraintMapper.addMapping(); return new OASResult(openapi, diagnostics); } else { diff --git a/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/constraint/ConstraintMapper.java b/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/constraint/ConstraintMapper.java index 94b193842..444a293f2 100644 --- a/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/constraint/ConstraintMapper.java +++ b/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/constraint/ConstraintMapper.java @@ -1,5 +1,6 @@ package io.ballerina.openapi.service.mapper.constraint; +import io.ballerina.compiler.api.SemanticModel; import io.ballerina.compiler.syntax.tree.AnnotationNode; import io.ballerina.compiler.syntax.tree.ExpressionNode; import io.ballerina.compiler.syntax.tree.MappingConstructorExpressionNode; @@ -44,12 +45,14 @@ public class ConstraintMapper { private final OpenAPI openAPI; private final ModuleMemberVisitor moduleMemberVisitor; + private final SemanticModel semanticModel; private final List diagnostics; - public ConstraintMapper(OpenAPI openAPI, ModuleMemberVisitor moduleMemberVisitor, + public ConstraintMapper(OpenAPI openAPI, ModuleMemberVisitor moduleMemberVisitor, SemanticModel semanticModel, List diagnostics) { this.openAPI = openAPI; this.moduleMemberVisitor = moduleMemberVisitor; + this.semanticModel = semanticModel; this.diagnostics = diagnostics; } @@ -60,7 +63,8 @@ public void addMapping() { } Map schemas = components.getSchemas(); for (Map.Entry schemaEntry : schemas.entrySet()) { - TypeDefinitionNode typeDefinitionNode = moduleMemberVisitor.getTypeDefinitionNode(schemaEntry.getKey()); + TypeDefinitionNode typeDefinitionNode = moduleMemberVisitor.getTypeDefinitionNode(schemaEntry.getKey(), + semanticModel); if (Objects.isNull(typeDefinitionNode)) { continue; } diff --git a/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/model/ModuleMemberVisitor.java b/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/model/ModuleMemberVisitor.java index c518cf940..df1e4db09 100644 --- a/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/model/ModuleMemberVisitor.java +++ b/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/model/ModuleMemberVisitor.java @@ -18,12 +18,16 @@ package io.ballerina.openapi.service.mapper.model; +import io.ballerina.compiler.api.SemanticModel; +import io.ballerina.compiler.api.symbols.Symbol; +import io.ballerina.compiler.api.symbols.TypeSymbol; import io.ballerina.compiler.syntax.tree.ListenerDeclarationNode; import io.ballerina.compiler.syntax.tree.NodeVisitor; import io.ballerina.compiler.syntax.tree.TypeDefinitionNode; import io.ballerina.openapi.service.mapper.utils.MapperCommonUtils; import java.util.LinkedHashSet; +import java.util.Optional; import java.util.Set; /** @@ -50,9 +54,11 @@ public Set getListenerDeclarationNodes() { return listenerDeclarationNodes; } - public TypeDefinitionNode getTypeDefinitionNode(String typeName) { + public TypeDefinitionNode getTypeDefinitionNode(String typeName, SemanticModel semanticModel) { for (TypeDefinitionNode typeDefinitionNode : typeDefinitionNodes) { - if (MapperCommonUtils.unescapeIdentifier(typeDefinitionNode.typeName().text()).equals(typeName)) { + Optional symbol = semanticModel.symbol(typeDefinitionNode); + if (symbol.isPresent() && symbol.get() instanceof TypeSymbol typeSymbol && + MapperCommonUtils.getTypeName(typeSymbol).equals(typeName)) { return typeDefinitionNode; } } diff --git a/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/type/RecordTypeMapper.java b/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/type/RecordTypeMapper.java index 026df8511..9ffa19c24 100644 --- a/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/type/RecordTypeMapper.java +++ b/ballerina-to-openapi/src/main/java/io/ballerina/openapi/service/mapper/type/RecordTypeMapper.java @@ -16,6 +16,7 @@ package io.ballerina.openapi.service.mapper.type; +import io.ballerina.compiler.api.SemanticModel; import io.ballerina.compiler.api.symbols.IntersectionTypeSymbol; import io.ballerina.compiler.api.symbols.RecordFieldSymbol; import io.ballerina.compiler.api.symbols.RecordTypeSymbol; @@ -139,7 +140,7 @@ public static Map mapRecordFields(Map } if (recordFieldSymbol.hasDefaultValue()) { Object recordFieldDefaultValue = getRecordFieldDefaultValue(recordName, recordFieldName, - additionalData.moduleMemberVisitor()); + additionalData.semanticModel(), additionalData.moduleMemberVisitor()); if (Objects.nonNull(recordFieldDefaultValue)) { TypeMapper.setDefaultValue(recordFieldSchema, recordFieldDefaultValue); } else { @@ -154,9 +155,9 @@ public static Map mapRecordFields(Map return properties; } - public static Object getRecordFieldDefaultValue(String recordName, String fieldName, + public static Object getRecordFieldDefaultValue(String recordName, String fieldName, SemanticModel semanticModel, ModuleMemberVisitor moduleMemberVisitor) { - TypeDefinitionNode recordDefNode = moduleMemberVisitor.getTypeDefinitionNode(recordName); + TypeDefinitionNode recordDefNode = moduleMemberVisitor.getTypeDefinitionNode(recordName, semanticModel); if (Objects.isNull(recordDefNode) || !(recordDefNode.typeDescriptor() instanceof RecordTypeDescriptorNode)) { return null; }