blob: a609bf6033eff31a744be1be8cc8a87194f20849 [file] [log] [blame]
# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Classes that are the "M" of MVC."""
import dataclasses
from typing import List
from typing import Optional
@dataclasses.dataclass(frozen=True)
class Param:
"""Describes a param for a method, either java or native."""
annotations: List[str]
datatype: str
name: str
@dataclasses.dataclass(frozen=True)
class JavaClass:
_fqn: str
visibility: Optional[str] = None
def __post_init__(self):
assert '.' not in self._fqn, f'{self._fqn} should have / and $, but not .'
def __str__(self):
return self.full_name_with_dots
@property
def name(self):
return self._fqn.rsplit('/', 1)[-1]
@property
def name_with_dots(self):
return self.name.replace('$', '.')
@property
def nested_name(self):
return self.name.rsplit('$', 1)[-1]
@property
def package_with_slashes(self):
return self._fqn.rsplit('/', 1)[0]
@property
def package_with_dots(self):
return self.package_with_slashes.replace('/', '.')
@property
def full_name_with_slashes(self):
return self._fqn
@property
def full_name_with_dots(self):
return self._fqn.replace('/', '.').replace('$', '.')
@property
def is_public(self):
return self.visibility == 'public'
def make_prefixed(self, prefix=None):
if not prefix:
return self
prefix = prefix.replace('.', '/')
return JavaClass(f'{prefix}/{self._fqn}', visibility=self.visibility)
def make_nested(self, name, visibility=None):
return JavaClass(f'{self._fqn}${name}', visibility=visibility)