View Javadoc
1   /*
2    *    Copyright 2006-2023 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.generator.api.dom.kotlin.render;
17  
18  import java.util.ArrayList;
19  import java.util.Iterator;
20  import java.util.List;
21  import java.util.stream.Collectors;
22  
23  import org.mybatis.generator.api.dom.java.render.RenderingUtilities;
24  import org.mybatis.generator.api.dom.kotlin.KotlinNamedItem;
25  import org.mybatis.generator.api.dom.kotlin.KotlinProperty;
26  import org.mybatis.generator.api.dom.kotlin.KotlinType;
27  import org.mybatis.generator.internal.util.CustomCollectors;
28  
29  public class KotlinTypeRenderer {
30  
31      public List<String> render(KotlinType kotlinType) {
32          KotlinNamedItemRenderer renderer = new KotlinNamedItemRenderer();
33  
34          List<String> answer = new ArrayList<>(kotlinType.getAnnotations());
35  
36          String renderedModifiers = KotlinRenderingUtilities.renderModifiers(kotlinType.getModifiers())
37              + kotlinType.getType().getValue(); //$NON-NLS-1$
38  
39          String renderedModifiersAndName;
40          if (kotlinType.getType() == KotlinType.Type.COMPANION_OBJECT && kotlinType.getName().equals(KotlinType.DEFAULT_COMPANION_OBJECT_NAME)) {
41              renderedModifiersAndName = renderedModifiers;
42          } else {
43              renderedModifiersAndName = renderedModifiers + " " + kotlinType.getName(); //$NON-NLS-1$
44          }
45  
46          String renderedSuperTypes = kotlinType.getSuperTypes().stream()
47                  .sorted()
48                  .collect(CustomCollectors.joining(", ", " : ", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
49  
50          if (kotlinType.getNamedItems().isEmpty()) {
51              if (kotlinType.getConstructorProperties().isEmpty()) {
52                  answer.add(renderedModifiersAndName + renderedSuperTypes);
53              } else {
54                  answer.add(renderedModifiersAndName + "("); //$NON-NLS-1$
55                  answer.addAll(renderConstructorItems(kotlinType));
56                  answer.add(")" + renderedSuperTypes); //$NON-NLS-1$
57              }
58          } else {
59              if (kotlinType.getConstructorProperties().isEmpty()) {
60                  answer.add(renderedModifiersAndName + renderedSuperTypes + " {"); //$NON-NLS-1$
61              } else {
62                  answer.add(renderedModifiersAndName + "("); //$NON-NLS-1$
63                  answer.addAll(renderConstructorItems(kotlinType));
64                  answer.add(")" + renderedSuperTypes + " {"); //$NON-NLS-1$ //$NON-NLS-2$
65              }
66          }
67  
68          for (KotlinNamedItem namedItem : kotlinType.getNamedItems()) {
69              answer.addAll(renderer.render(namedItem).stream().map(KotlinRenderingUtilities::kotlinIndent)
70                      .collect(Collectors.toList()));
71              answer.add(""); //$NON-NLS-1$
72          }
73  
74          answer = RenderingUtilities.removeLastEmptyLine(answer);
75  
76          if (!kotlinType.getNamedItems().isEmpty()) {
77              answer.add("}"); //$NON-NLS-1$
78          }
79  
80          return answer;
81      }
82  
83      private List<String> renderConstructorItems(KotlinType kotlinType) {
84          List<String> lines = new ArrayList<>();
85          KotlinPropertyRenderer renderer = new KotlinPropertyRenderer();
86  
87          Iterator<KotlinProperty> iter = kotlinType.getConstructorProperties().iterator();
88          while (iter.hasNext()) {
89              lines.addAll(renderer.render(iter.next()).stream().map(KotlinRenderingUtilities::kotlinIndent)
90                      .collect(Collectors.toList()));
91              if (iter.hasNext()) {
92                  lines.set(lines.size() - 1,
93                          lines.get(lines.size() - 1) + ","); //$NON-NLS-1$
94              }
95          }
96  
97          return lines;
98      }
99  }