Robot Framework Integrated Development Environment (RIDE)
java9builder.py
Go to the documentation of this file.
1 # Copyright 2008-2015 Nokia Networks
2 # Copyright 2016- Robot Framework Foundation
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 # http://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 from inspect import cleandoc
17 
18 from java.nio.charset import StandardCharsets
19 from java.util import Locale
20 from javax.lang.model.element.Modifier import PUBLIC
21 from javax.lang.model.util import ElementFilter
22 from javax.lang.model.type import TypeKind
23 from javax.tools import DocumentationTool, ToolProvider
24 
25 from robotide.lib.robot.utils import normalize, printable_name, split_tags_from_doc
26 
27 from .model import LibraryDoc, KeywordDoc
28 
29 
31 
32  def build(self, path):
33  qualified_name, type_element, fields, constructors, methods, elements \
34  = self._get_documentation_data_get_documentation_data(path)
35  libdoc = LibraryDoc(name=qualified_name,
36  doc=self._get_doc_get_doc(elements, type_element),
37  version=self._get_version_get_version(fields),
38  scope=self._get_scope_get_scope(fields),
39  named_args=False,
40  doc_format=self._get_doc_format_get_doc_format(fields))
41  libdoc.inits = self._initializers_initializers(elements, constructors)
42  libdoc.keywords = self._keywords_keywords(elements, methods)
43  return libdoc
44 
45  def _get_doc(self, elements, element):
46  doc = elements.getDocComment(element)
47  return cleandoc(doc or '').rstrip()
48 
49  def _get_version(self, fields):
50  return self._get_attr_get_attr(fields, 'VERSION')
51 
52  def _get_scope(self, fields):
53  scope = self._get_attr_get_attr(fields, 'SCOPE', upper=True)
54  return {'TESTSUITE': 'test suite',
55  'GLOBAL': 'global'}.get(scope, 'test suite')
56 
57  def _get_doc_format(self, fields):
58  return self._get_attr_get_attr(fields, 'DOC_FORMAT', upper=True)
59 
60  def _get_attr(self, fields, name, upper=False):
61  name = 'ROBOT_LIBRARY_' + name
62  for field in fields:
63  if field.getSimpleName().toString() == name:
64  value = field.getConstantValue()
65  if upper:
66  value = normalize(value, ignore='_').upper()
67  return value
68  return ''
69 
70  def _initializers(self, elements, constructors):
71  inits = [self._keyword_doc_keyword_doc(elements, constructor)
72  for constructor in constructors]
73  if len(inits) == 1 and not inits[0].args:
74  return []
75  return inits
76 
77  def _keywords(self, elements, methods):
78  return [self._keyword_doc_keyword_doc(elements, method) for method in methods]
79 
80  def _keyword_doc(self, elements, method):
81  doc, tags = split_tags_from_doc(self._get_doc_get_doc(elements, method))
82  return KeywordDoc(
83  name=printable_name(method.getSimpleName().toString(),
84  code_style=True),
85  args=self._get_keyword_arguments_get_keyword_arguments(method),
86  doc=doc,
87  tags=tags
88  )
89 
90  def _get_keyword_arguments(self, method):
91  params = method.getParameters()
92  if not params:
93  return []
94  names = [param.getSimpleName().toString() for param in params]
95  if self._is_varargs_is_varargs(params[-1]):
96  names[-1] = '*' + names[-1]
97  elif self._is_kwargs_is_kwargs(params[-1]):
98  names[-1] = '**' + names[-1]
99  if len(params) > 1 and self._is_varargs_is_varargs(params[-2]):
100  names[-2] = '*' + names[-2]
101  return names
102 
103  def _is_varargs(self, param):
104  param_type = param.asType()
105  return (param_type.toString().startswith('java.util.List') or
106  (param_type.getKind() == TypeKind.ARRAY and
107  param_type.getComponentType().getKind() != TypeKind.ARRAY))
108 
109  def _is_kwargs(self, param):
110  return param.asType().toString().startswith('java.util.Map')
111 
112  def _get_documentation_data(self, path):
113  doc_tool = ToolProvider.getSystemDocumentationTool()
114  file_manager = DocumentationTool.getStandardFileManager(
115  doc_tool, None, Locale.US, StandardCharsets.UTF_8)
116  compiler = ToolProvider.getSystemJavaCompiler()
117  source = file_manager.getJavaFileObjectsFromStrings([path])
118  task = compiler.getTask(None, None, None, None, None, source)
119  type_element = task.analyze().iterator().next()
120  elements = task.getElements()
121  members = elements.getAllMembers(type_element)
122  qf_name = type_element.getQualifiedName().toString()
123  fields = [f for f in ElementFilter.fieldsIn(members)
124  if PUBLIC in f.getModifiers()]
125  constructors = [c for c in ElementFilter.constructorsIn(members)
126  if PUBLIC in c.getModifiers()]
127  methods = [m for m in ElementFilter.methodsIn(members)
128  if m.getEnclosingElement() is type_element and
129  PUBLIC in m.getModifiers()]
130  return qf_name, type_element, fields, constructors, methods, elements
def _get_attr(self, fields, name, upper=False)
Definition: java9builder.py:60
def _initializers(self, elements, constructors)
Definition: java9builder.py:70
def printable_name(string, code_style=False)
Generates and returns printable name from the given string.
Definition: misc.py:76
def normalize(string, ignore=(), caseless=True, spaceless=True)
Normalizes given string according to given spec.
Definition: normalizing.py:30
def split_tags_from_doc(doc)
Definition: text.py:158