Class JavaRewriter

java.lang.Object
com.vaadin.copilot.javarewriter.JavaRewriter

public class JavaRewriter extends Object
Rewrites Java source code to add or replace constructor parameters, method invocations and more.
  • Constructor Details

    • JavaRewriter

      public JavaRewriter()
  • Method Details

    • replaceFunctionCall

      public JavaRewriter.ReplaceResult replaceFunctionCall(ComponentInfo componentInfo, String function, Object value)
      Replaces a constructor parameter (if it is mapped to the given setter function) or a function call in the source code.
      Parameters:
      componentInfo - the component to modify
      function - the name of the function to replace or add, if the constructor parameter is not found
      value - the new value for the constructor parameter or function call, or null to remove the function call
      Returns:
      the new variable name if the variable name was auto-generated and changed, otherwise null
    • addConstructorParameterToClass

      public String addConstructorParameterToClass(ComponentInfo referenceComponent, String parameterTypeName, String suggestedParameterName, boolean storeAsField)
      Adds a parameter of the given type to the constructor for the class containing the given component.

      Does not add another parameter, if a parameter of the given type is already present.

      Optionally creates a new field for the parameter and copy the value to the field.

      Parameters:
      referenceComponent - a component instance created inside the class - used to find the class and its constructor
      parameterTypeName - the type of parameter
      suggestedParameterName - a suggested name for the parameter
      storeAsField - true to create a field and copy the parameter value there, false to add the parameter to the constructor only
      Returns:
      the name of the added field, if storeAsField is true, otherwise the name of the added parameter
    • addCall

      public void addCall(ComponentInfo componentInfo, String function, Object... parameters)
      Adds a function call to the source code.
      Parameters:
      componentInfo - the component to modify
      function - the name of the function to add
      parameters - parameters for the function
    • replaceOrAddCall

      public void replaceOrAddCall(ComponentInfo componentInfo, String function, Object... parameters)
      Replaces a function call in the source code, if found, otherwise adds the function call.
      Parameters:
      componentInfo - the component to modify
      function - the name of the function call to add or replace
      parameters - new parameters for the function
    • removePropertySetter

      public void removePropertySetter(ComponentInfo componentInfo, String setter)
      Removes all property set calls or references in constructors initializations
      Parameters:
      componentInfo - the component to modify
      setter - the name of the property setter.
    • removeCalls

      public void removeCalls(ComponentInfo componentInfo, String function)
      Removes all calls to the given function from the source code.
      Parameters:
      componentInfo - the component to modify
      function - the name of the function to remove parameter is not found
    • getPropertyValue

      public Object getPropertyValue(ComponentInfo componentInfo, String property)
      Gets the (active) value of a property of a component.

      The property value is determined by looking for a setter method call in the source code. If the property is not set using a setter, the constructor is checked.

      If the property is not set using a setter or in the constructor, null is returned.

      If the property is set using a method call, the method call expression is returned.

      Parameters:
      componentInfo - the component to get the property value from
      property - the property name
      Returns:
      the property value, or null if the property is not set
    • getStyles

      public List<JavaStyleRewriter.StyleInfo> getStyles(ComponentInfo componentInfo)
      Gets the (active) styles of a component.
      Parameters:
      componentInfo - the component to get the styles of
      Returns:
      the styles, as a list of style names and values
    • setStyle

      public void setStyle(ComponentInfo component, String property, String value)
      Sets the given inline style on the given component, replacing an existing style property if present.
      Parameters:
      component - the component to set the style on
      property - the style property to set
      value - the style value to set or null to remove the style
    • setSizing

      public void setSizing(ComponentInfo componentInfo, Map<String,String> changes)
      Sets sizing properties of the given component using the Style API. Replaces existing ones and removes the keys which have null values.
      For removal, it also looks for Component API to remove such button.setWidth("") calls.
      Parameters:
      componentInfo - the component to set style
      changes - changes applied. Having null value for a key means removal, otherwise update/add applies.
    • delete

      public boolean delete(ComponentInfo componentInfo)
      Deletes a component from the source code.
      Parameters:
      componentInfo - the component to delete
      Returns:
      true if the deletion was successful, false otherwise
    • moveComponent

      public void moveComponent(ComponentInfo component, ComponentInfo container, ComponentInfo reference, JavaRewriter.Where where)
      Moves a component in the source code.
      Parameters:
      component - the component to move
      container - the new container for the component, if where is Where.APPEND.
      reference - the reference component to move the component before, if where is Where.BEFORE.
      where - where to move the component
    • duplicate

      public void duplicate(ComponentInfo component)
    • duplicate

      public JavaRewriter.DuplicateInfo duplicate(ComponentInfo component, boolean handleAdd)
      Duplicates a component in the source code.
      Parameters:
      component - the component to duplicate
      handleAdd - true to automatically add the new component next to the old one, false to handle add calls like any other method call
      Returns:
      a map from old component name to new component name
    • addComponentUsingTemplate

      public List<ComponentInfo> addComponentUsingTemplate(ComponentInfo referenceComponent, JavaRewriter.Where where, List<JavaComponent> template, JavaRewriter.AddTemplateOptions options)
      Adds the given code snippet to the source code either before the reference component (Where.BEFORE) or by appending to the layout (Where.APPEND).
      Parameters:
      referenceComponent - the reference component (BEFORE) or container (APPEND) to add the code
      where - where to add the code
      template - the code to add, as JSON array of objects with "tag", "props" and "children"
      options - options that control how the template is added
      Returns:
      the created components
    • findInsertionPointForAppend

      public InsertionPoint findInsertionPointForAppend(ComponentInfo component, JavaRewriter.Where where)
    • setAlignment

      public void setAlignment(ComponentInfo component, String alignItemsClassName, String justifyContentClassName)
    • setGap

      public void setGap(ComponentInfo component, String lumoClassAll, String lumoClassColumn, String lumoClassRow)
      Sets gap to selected component
      Parameters:
      component - component to set gap
      lumoClassAll - gap all value. e.g. gap-m. might be null
      lumoClassColumn - gap column value which starts with gap-x prefix, e.g. gap-x-xs. might be null
      lumoClassRow - gap row value which starts with gap-y prefix, e.g. gap-y-xs. might be null
    • setPadding

      public void setPadding(ComponentInfo component, String all, String top, String right, String bottom, String left)
    • mergeAndReplace

      public void mergeAndReplace(List<ComponentInfo> components, JavaComponent wrapperComponent)
      Merges all the components and wraps them using the given component and places the result in place of the first component.
      Parameters:
      components - The components to merge. The first component will be replaced with the wrapper component
      wrapperComponent - The component to wrap the merged components in.
    • extractComponent

      public void extractComponent(ComponentInfo component, IdentityHashMap<ComponentInfo,List<ComponentInfo>> componentChildren, String extractedComponentClassNameSuggestion)
      Extracts the given component, including its children, to a new component.
      Parameters:
      component - The component to extract.
      componentChildren - Children info for the component and its contents. This is an identity hash map to ensure that the component info is found even after the AST has been modified. A record in Java uses the data for hashcode/equals so they can change when e.g. a block changes, which would make a lookup in a normal hash map to fail.
      extractedComponentClassNameSuggestion - A suggestion for the name of the new component. Will be modified if it is already in use.
    • replaceCallParameter

      public void replaceCallParameter(com.github.javaparser.ast.nodeTypes.NodeWithArguments<?> call, String oldVariableName, String newVariableName)
      Replaces a parameter name in a method call.
      Parameters:
      call -
      oldVariableName -
      newVariableName -
    • importLitTemplate

      public void importLitTemplate(JavaSource litTemplateSource, List<JavaComponent> componentDefinitions)
      Imports the given components that come from a lit template into the given LitTemplate Java class.
      Parameters:
      litTemplateSource - the source of the LitTemplate class
      componentDefinitions - component definitions extracted from the corresponding lit template typescript file
    • createComponentStatements

      public List<ComponentInfo> createComponentStatements(InsertionPoint insertionPoint, JavaComponent parent, List<JavaComponent> template, String layoutVariableName, ComponentInfo referenceComponent, JavaRewriter.AddTemplateOptions options, JavaRewriter.Where where, JavaSource javaSource)
    • createComponentStatements

      public ComponentInfo createComponentStatements(InsertionPoint insertionPoint, JavaComponent parent, JavaComponent maybeJavaComponent, boolean attach, String layoutVariableName, ComponentInfo referenceComponent, JavaRewriter.AddTemplateOptions options, JavaRewriter.Where where, JavaSource javaSource)
    • attachComponent

      public AttachExpression attachComponent(InsertionPoint insertionPoint, JavaComponent component, JavaComponent parent, String layoutVariableName, ComponentInfo referenceComponent, com.github.javaparser.ast.expr.Expression variableNameExpr, String variableName, JavaRewriter.AddTemplateOptions options, JavaRewriter.Where where)
    • getParameterList

      public com.github.javaparser.ast.NodeList<com.github.javaparser.ast.expr.Expression> getParameterList(InsertionPoint insertionPoint, Object value, JavaSource javaSource)
    • insertSetter

      public void insertSetter(InsertionPoint insertionPoint, com.github.javaparser.ast.expr.Expression owner, String setterName, Object value, JavaComponent javaComponent, JavaSource javaSource)
      Insert setters for given java component. TODO move this class into CustomComponentHandle and remove it from here
      Parameters:
      insertionPoint - Insertion point to add setters
      owner - owner of the setters
      setterName - setterName from JavaComponent props
      value - setterValue from JavaComponent props
      javaComponent - Java component itself
      javaSource -
    • setGridDataSource

      public void setGridDataSource(ComponentInfo grid, String serviceClassName, String serviceMethodName, List<JavaReflectionUtil.ParameterTypeInfo> parameterTypes, String itemTypeClassName, List<UIServiceCreator.FieldInfo> itemPropertiesOrder)
      Connects the given grid to the given service method, using the given item type and order for the columns.
      Parameters:
      grid - the grid to connect
      serviceClassName - The service class to use as data source
      serviceMethodName - the service method to use as data source
      parameterTypes - the service method parameter types
      itemTypeClassName - the item type to show in the grid, must correspond to the service method return type argument
      itemPropertiesOrder - the order of the properties to show in the grid
    • setComboBoxDataSource

      public void setComboBoxDataSource(ComponentInfo comboBox, String serviceClassName, String serviceMethodName, List<JavaReflectionUtil.ParameterTypeInfo> parameterTypes, String itemTypeClassName, UIServiceCreator.FieldInfo displayProperty)
      Connects the given combo box to the given service method, using the given item type and order for the columns.
      Parameters:
      comboBox - the combo box to connect
      serviceClassName - The service class to use as data source
      serviceMethodName - the service method to use as data source
      parameterTypes - the service method parameter types
      itemTypeClassName - the item type to show in the grid, must correspond to the service method return type argument
      displayProperty - the property to display in the combo box
    • addComment

      public void addComment(ComponentInfo componentInfo, String comment, JavaRewriter.CommentType commentType)
      Adds a comment to the specified component in the source code.
      Parameters:
      componentInfo - the component to which the comment should be added
      comment - the comment to add
      commentType - the type of comment (LINE, BLOCK, JAVADOC)