Skip to content

Commit

Permalink
Merge pull request #639 from LakshanWeerasinghe/fix-#721
Browse files Browse the repository at this point in the history
Introduce typeMember Property Field
  • Loading branch information
hasithaa authored Mar 3, 2025
2 parents fcb5650 + 550e589 commit 041f4c9
Show file tree
Hide file tree
Showing 108 changed files with 21,569 additions and 1,808 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package io.ballerina.flowmodelgenerator.core;

import io.ballerina.compiler.api.ModuleID;
import io.ballerina.compiler.api.SemanticModel;
import io.ballerina.compiler.api.symbols.ClassSymbol;
import io.ballerina.compiler.api.symbols.FunctionSymbol;
Expand Down Expand Up @@ -342,6 +343,7 @@ public void visit(ClientResourceAccessActionNode clientResourceAccessActionNode)
.stepOut()
.value(expr.toSourceCode())
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers())
.type(Property.ValueType.EXPRESSION)
.editable()
.defaultable(paramResult.optional())
Expand Down Expand Up @@ -401,6 +403,7 @@ private void addRemainingParamsToPropertyMap(Map<String, ParameterData> funcPara
.stepOut()
.placeholder(paramResult.defaultValue())
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers())
.editable()
.defaultable(paramResult.optional());

Expand Down Expand Up @@ -475,6 +478,7 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
.stepOut()
.placeholder(paramResult.defaultValue())
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers())
.editable()
.defaultable(paramResult.optional());

Expand Down Expand Up @@ -523,15 +527,29 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
funcParamMap.remove(parameterSymbol.getName().get());
Property.Builder<FormBuilder<NodeBuilder>> customPropBuilder =
nodeBuilder.properties().custom();
String value = paramValue != null ? paramValue.toSourceCode() : null;
String unescapedParamName = ParamUtils.removeLeadingSingleQuote(paramResult.name());
String value = null;
String selectedType = "";
if (paramValue != null) {
value = paramValue.toSourceCode();
Optional<TypeSymbol> paramType = semanticModel.typeOf(paramValue);
if (paramType.isPresent()) {
if (paramType.get().getModule().isPresent()) {
ModuleID id = paramType.get().getModule().get().id();
selectedType = CommonUtils.getTypeSignature(paramType.get(), ModuleInfo.from(id));
} else {
selectedType = CommonUtils.getTypeSignature(paramType.get(), null);
}
}
}
customPropBuilder
.metadata()
.label(unescapedParamName)
.description(paramResult.description())
.stepOut()
.type(getPropertyTypeFromParamKind(paramResult.kind()))
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers(), selectedType)
.value(value)
.placeholder(paramResult.defaultValue())
.editable()
Expand Down Expand Up @@ -561,6 +579,7 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
.stepOut()
.type(getPropertyTypeFromParamKind(restParamResult.kind()))
.typeConstraint(restParamResult.type())
.typeMembers(restParamResult.typeMembers())
.value(restArgs)
.placeholder(restParamResult.defaultValue())
.editable()
Expand Down Expand Up @@ -611,13 +630,24 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
nodeBuilder.properties().custom();
String value = paramValue != null ? paramValue.toSourceCode() : null;
String unescapedParamName = ParamUtils.removeLeadingSingleQuote(paramResult.name());
Optional<TypeSymbol> paramType = semanticModel.typeOf(paramValue);
String selectedType = "";
if (paramType.isPresent()) {
if (paramType.get().getModule().isPresent()) {
ModuleID id = paramType.get().getModule().get().id();
selectedType = CommonUtils.getTypeSignature(paramType.get(), ModuleInfo.from(id));
} else {
selectedType = CommonUtils.getTypeSignature(paramType.get(), null);
}
}
customPropBuilder
.metadata()
.label(unescapedParamName)
.description(paramResult.description())
.stepOut()
.type(getPropertyTypeFromParamKind(paramResult.kind()))
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers(), selectedType)
.value(value)
.placeholder(paramResult.defaultValue())
.editable()
Expand All @@ -639,7 +669,22 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
paramValue = namedArgValueMap.get(argName);
namedArgValueMap.remove(argName);
}
String value = paramValue != null ? paramValue.toSourceCode() : null;
String value = null;
String selectedType = "";
if (paramValue != null) {
value = paramValue.toSourceCode();
Optional<TypeSymbol> paramType = semanticModel.typeOf(paramValue);
if (paramType.isPresent()) {
if (paramType.get().getModule().isPresent()) {
ModuleID id = paramType.get().getModule().get().id();
selectedType = CommonUtils.getTypeSignature(
paramType.get(), ModuleInfo.from(id));
} else {
selectedType = CommonUtils.getTypeSignature(paramType.get(), null);
}
}
}

String unescapedParamName = ParamUtils.removeLeadingSingleQuote(paramResult.name());
customPropBuilder
.metadata()
Expand All @@ -648,6 +693,7 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
.stepOut()
.type(getPropertyTypeFromParamKind(paramResult.kind()))
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers(), selectedType)
.value(value)
.placeholder(paramResult.defaultValue())
.editable()
Expand All @@ -671,13 +717,24 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
String unescapedParamName = ParamUtils.removeLeadingSingleQuote(paramResult.name());
funcParamMap.remove(escapedParamName);
String value = paramValue.toSourceCode();
Optional<TypeSymbol> paramType = semanticModel.typeOf(paramValue);
String selectedType = "";
if (paramType.isPresent()) {
if (paramType.get().getModule().isPresent()) {
ModuleID id = paramType.get().getModule().get().id();
selectedType = CommonUtils.getTypeSignature(paramType.get(), ModuleInfo.from(id));
} else {
selectedType = CommonUtils.getTypeSignature(paramType.get(), null);
}
}
customPropBuilder
.metadata()
.label(unescapedParamName)
.description(paramResult.description())
.stepOut()
.type(getPropertyTypeFromParamKind(paramResult.kind()))
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers(), selectedType)
.value(value)
.placeholder(paramResult.defaultValue())
.editable()
Expand All @@ -701,15 +758,29 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
Property.Builder<FormBuilder<NodeBuilder>> customPropBuilder =
nodeBuilder.properties().custom();
funcParamMap.remove(escapedParamName);
String value = paramValue != null ? paramValue.toSourceCode() : null;
String unescapedParamName = ParamUtils.removeLeadingSingleQuote(paramResult.name());
String value = null;
String selectedType = "";
if (paramValue != null) {
value = paramValue.toSourceCode();
Optional<TypeSymbol> paramType = semanticModel.typeOf(paramValue);
if (paramType.isPresent()) {
if (paramType.get().getModule().isPresent()) {
ModuleID id = paramType.get().getModule().get().id();
selectedType = CommonUtils.getTypeSignature(paramType.get(), ModuleInfo.from(id));
} else {
selectedType = CommonUtils.getTypeSignature(paramType.get(), null);
}
}
}
customPropBuilder
.metadata()
.label(unescapedParamName)
.description(paramResult.description())
.stepOut()
.type(getPropertyTypeFromParamKind(paramResult.kind()))
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers(), selectedType)
.value(value)
.placeholder(paramResult.defaultValue())
.editable()
Expand Down Expand Up @@ -740,6 +811,7 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList<FunctionArgumentNode>
.stepOut()
.type(getPropertyTypeFromParamKind(includedRecordRest.kind()))
.typeConstraint(includedRecordRest.type())
.typeMembers(includedRecordRest.typeMembers())
.value(includedRecordRestArgs)
.placeholder(includedRecordRest.defaultValue())
.editable()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import io.ballerina.compiler.api.symbols.TypeSymbol;
import io.ballerina.flowmodelgenerator.core.DiagnosticHandler;
import io.ballerina.modelgenerator.commons.CommonUtils;
import io.ballerina.modelgenerator.commons.ParameterMemberTypeData;

import java.util.List;

Expand All @@ -40,11 +41,12 @@
* @param advanced whether the property should be shown in the advanced tab
* @param diagnostics diagnostics of the property
* @param codedata codedata of the property
* @param typeMembers member types of the type constrain
* @since 2.0.0
*/
public record Property(Metadata metadata, String valueType, Object valueTypeConstraint, Object value,
String placeholder, boolean optional, boolean editable, boolean advanced,
Diagnostics diagnostics, PropertyCodedata codedata) {
Diagnostics diagnostics, PropertyCodedata codedata, List<PropertyTypeMemberInfo> typeMembers) {

private static final Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();

Expand Down Expand Up @@ -232,6 +234,7 @@ public static class Builder<T> extends FacetedBuilder<T> implements DiagnosticHa
private Metadata.Builder<Builder<T>> metadataBuilder;
private Diagnostics.Builder<Builder<T>> diagnosticsBuilder;
private PropertyCodedata.Builder<Builder<T>> codedataBuilder;
private List<PropertyTypeMemberInfo> typeMembers;

public Builder(T parentBuilder) {
super(parentBuilder);
Expand Down Expand Up @@ -295,6 +298,18 @@ public Metadata.Builder<Builder<T>> metadata() {
return this.metadataBuilder;
}

public Builder<T> typeMembers(List<ParameterMemberTypeData> memberTypeData) {
this.typeMembers = memberTypeData.stream().map(memberType -> new PropertyTypeMemberInfo(memberType.type(),
memberType.packageInfo(), memberType.kind(), false)).toList();
return this;
}

public Builder<T> typeMembers(List<ParameterMemberTypeData> memberTypeData, String selectedType) {
this.typeMembers = memberTypeData.stream().map(memberType -> new PropertyTypeMemberInfo(memberType.type(),
memberType.packageInfo(), memberType.kind(), memberType.type().equals(selectedType))).toList();
return this;
}

public PropertyCodedata.Builder<Builder<T>> codedata() {
if (this.codedataBuilder == null) {
this.codedataBuilder = new PropertyCodedata.Builder<>(this);
Expand All @@ -315,7 +330,7 @@ public Property build() {
new Property(metadataBuilder == null ? null : metadataBuilder.build(), type, typeConstraint, value,
placeholder, optional, editable, advanced,
diagnosticsBuilder == null ? null : diagnosticsBuilder.build(),
codedataBuilder == null ? null : codedataBuilder.build());
codedataBuilder == null ? null : codedataBuilder.build(), typeMembers);
this.metadataBuilder = null;
this.type = null;
this.typeConstraint = null;
Expand All @@ -326,6 +341,7 @@ public Property build() {
this.advanced = false;
this.diagnosticsBuilder = null;
this.codedataBuilder = null;
this.typeMembers = null;
return property;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* Copyright (c) 2024, WSO2 LLC. (http://www.wso2.com)
*
* WSO2 LLC. 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.
*/


package io.ballerina.flowmodelgenerator.core.model;

/**
* Represents the metadata of a diagram component.
*
* @since 2.0.0
*/
public class PropertyTypeMemberInfo {

private final String type;
private final String packageInfo;
private final String kind;
private boolean selected;

public PropertyTypeMemberInfo(String type, String packageInfo, String kind, boolean selected) {
this.type = type;
this.packageInfo = packageInfo;
this.kind = kind;
this.selected = selected;
}

public String type() {
return type;
}

public String packageInfo() {
return packageInfo;
}

public String kind() {
return kind;
}

public boolean selected() {
return selected;
}

public void selected(boolean selected) {
this.selected = selected;
}

public static class Builder<T> extends FacetedBuilder<T> {

private String type;
private String packageInfo;
private String kind;
private boolean selected = false;

public Builder(T parentBuilder) {
super(parentBuilder);
}

public Builder<T> type(String type) {
this.type = type;
return this;
}

public Builder<T> packageInfo(String packageInfo) {
this.packageInfo = packageInfo;
return this;
}

public Builder<T> kind(String kind) {
this.kind = kind;
return this;
}

public Builder<T> selected(boolean selected) {
this.selected = selected;
return this;
}

public PropertyTypeMemberInfo build() {
return new PropertyTypeMemberInfo(type, packageInfo, kind, selected);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ protected void setParameterProperties(FunctionData function) {
.stepOut()
.placeholder(paramResult.defaultValue())
.typeConstraint(paramResult.type())
.typeMembers(paramResult.typeMembers())
.editable()
.defaultable(paramResult.optional());

Expand Down
Loading

0 comments on commit 041f4c9

Please sign in to comment.