def compile_method(self, method): signature = util.StringBuilder() for annotation in method.annotations: formatter.output_annotation(annotation, signature) formatter.output_modifiers(method.modifiers, signature) signature.append(' ') if method.type_parameters: formatter.output_type_params(method.type_parameters, signature) signature.append(' ') formatter.output_type(method.return_type, signature) signature.append(' ') signature.append(method.name) signature.append('(') formatter.output_list(formatter.output_formal_param, method.parameters, signature, ', ') signature.append(')') if method.throws: signature.append(' throws ') formatter.output_list(formatter.output_exception, method.throws, signature, ', ') doc = self.__output_doc(method) directive = util.Directive('java:method', signature.build()) directive.add_content(doc) return directive
def handle_constructor_signature(self, sig, signode): try: member = javalang.parse.parse_constructor_signature(sig) except javalang.parser.JavaSyntaxError: raise self.error("syntax error in constructor signature") if not isinstance(member, javalang.tree.ConstructorDeclaration): raise self.error("expected constructor declaration") mods = formatter.output_modifiers(member.modifiers).build() signode += nodes.Text(mods + ' ', mods + ' ') signode += addnodes.desc_name(member.name, member.name) paramlist = addnodes.desc_parameterlist() for parameter in member.parameters: param = addnodes.desc_parameter('', '', noemph=True) param += self._build_type_node(parameter.type) if parameter.varargs: param += nodes.Text('...', '') param += nodes.emphasis(' ' + parameter.name, ' ' + parameter.name) paramlist += param signode += paramlist param_reprs = [formatter.output_type(param.type, with_generics=False).build() for param in member.parameters] return '%s(%s)' % (member.name, ', '.join(param_reprs))
def compile_field(self, field): signature = util.StringBuilder() for annotation in field.annotations: formatter.output_annotation(annotation, signature) formatter.output_modifiers(field.modifiers, signature) signature.append(' ') formatter.output_type(field.type, signature) signature.append(' ') signature.append(field.declarators[0].name) doc = self.__output_doc(field) directive = util.Directive('java:field', signature.build()) directive.add_content(doc) return directive
def _build_type_node(self, typ): if isinstance(typ, javalang.tree.ReferenceType): if typ.dimensions: dim = '[]' * len(typ.dimensions) else: dim = '' target = typ.name parts = [] while typ: ref_node = self._build_ref_node(target) ref_node += nodes.Text(typ.name, typ.name) parts.append(ref_node) if typ.arguments: parts.append(nodes.Text('<', '<')) first = True for type_arg in typ.arguments: if first: first = False else: parts.append(nodes.Text(', ', ', ')) if type_arg.pattern_type == '?': parts.append(nodes.Text('?', '?')) else: if type_arg.pattern_type: s = '? %s ' % (type_arg.pattern_type,) parts.append(nodes.Text(s, s)) parts.extend(self._build_type_node(type_arg.type)) parts.append(nodes.Text('>', '>')) typ = typ.sub_type if typ: target = target + '.' + typ.name parts.append(nodes.Text('.', '.')) elif dim: parts.append(nodes.Text(dim, dim)) return parts else: type_repr = formatter.output_type(typ).build() return [nodes.Text(type_repr, type_repr)]