Skip to content

Commit d83491a

Browse files
committed
Back to the future: rewrite to inline
As a first step, rename all occurrences of `rewrite` to `inline`.
1 parent 9bfaf2b commit d83491a

File tree

244 files changed

+640
-637
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

244 files changed

+640
-637
lines changed

bench/tests/power-macro/PowerMacro.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import scala.quoted.Expr
22

33
object PowerMacro {
44

5-
rewrite def power(transparent n: Long, x: Double) = ~powerCode(n, '(x))
5+
inline def power(transparent n: Long, x: Double) = ~powerCode(n, '(x))
66

77
def powerCode(n: Long, x: Expr[Double]): Expr[Double] =
88
if (n == 0) '(1.0)

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,9 @@ object Trees {
497497
extends TermTree[T] {
498498
type ThisTree[-T >: Untyped] = If[T]
499499
}
500-
class RewriteIf[T >: Untyped] private[ast] (cond: Tree[T], thenp: Tree[T], elsep: Tree[T])
500+
class InlineIf[T >: Untyped] private[ast] (cond: Tree[T], thenp: Tree[T], elsep: Tree[T])
501501
extends If(cond, thenp, elsep) {
502-
override def toString = s"RewriteIf($cond, $thenp, $elsep)"
502+
override def toString = s"InlineIf($cond, $thenp, $elsep)"
503503
}
504504

505505
/** A closure with an environment and a reference to a method.
@@ -521,9 +521,9 @@ object Trees {
521521
extends TermTree[T] {
522522
type ThisTree[-T >: Untyped] = Match[T]
523523
}
524-
class RewriteMatch[T >: Untyped] private[ast] (selector: Tree[T], cases: List[CaseDef[T]])
524+
class InlineMatch[T >: Untyped] private[ast] (selector: Tree[T], cases: List[CaseDef[T]])
525525
extends Match(selector, cases) {
526-
override def toString = s"RewriteMatch($selector, $cases)"
526+
override def toString = s"InlineMatch($selector, $cases)"
527527
}
528528

529529
/** case pat if guard => body; only appears as child of a Match */
@@ -904,10 +904,10 @@ object Trees {
904904
type Assign = Trees.Assign[T]
905905
type Block = Trees.Block[T]
906906
type If = Trees.If[T]
907-
type RewriteIf = Trees.RewriteIf[T]
907+
type InlineIf = Trees.InlineIf[T]
908908
type Closure = Trees.Closure[T]
909909
type Match = Trees.Match[T]
910-
type RewriteMatch = Trees.RewriteMatch[T]
910+
type InlineMatch = Trees.InlineMatch[T]
911911
type CaseDef = Trees.CaseDef[T]
912912
type Labeled = Trees.Labeled[T]
913913
type Return = Trees.Return[T]
@@ -1038,9 +1038,9 @@ object Trees {
10381038
case _ => finalize(tree, untpd.Block(stats, expr))
10391039
}
10401040
def If(tree: Tree)(cond: Tree, thenp: Tree, elsep: Tree)(implicit ctx: Context): If = tree match {
1041-
case tree: RewriteIf =>
1041+
case tree: InlineIf =>
10421042
if ((cond eq tree.cond) && (thenp eq tree.thenp) && (elsep eq tree.elsep)) tree
1043-
else finalize(tree, untpd.RewriteIf(cond, thenp, elsep))
1043+
else finalize(tree, untpd.InlineIf(cond, thenp, elsep))
10441044
case tree: If if (cond eq tree.cond) && (thenp eq tree.thenp) && (elsep eq tree.elsep) => tree
10451045
case _ => finalize(tree, untpd.If(cond, thenp, elsep))
10461046
}
@@ -1049,9 +1049,9 @@ object Trees {
10491049
case _ => finalize(tree, untpd.Closure(env, meth, tpt))
10501050
}
10511051
def Match(tree: Tree)(selector: Tree, cases: List[CaseDef])(implicit ctx: Context): Match = tree match {
1052-
case tree: RewriteMatch =>
1052+
case tree: InlineMatch =>
10531053
if ((selector eq tree.selector) && (cases eq tree.cases)) tree
1054-
else finalize(tree, untpd.RewriteMatch(selector, cases))
1054+
else finalize(tree, untpd.InlineMatch(selector, cases))
10551055
case tree: Match if (selector eq tree.selector) && (cases eq tree.cases) => tree
10561056
case _ => finalize(tree, untpd.Match(selector, cases))
10571057
}

compiler/src/dotty/tools/dotc/ast/untpd.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
132132

133133
case class Lazy() extends Mod(Flags.Lazy)
134134

135-
case class Rewrite() extends Mod(Flags.Rewrite)
135+
case class Inline() extends Mod(Flags.Inline)
136136

137137
case class Transparent() extends Mod(Flags.Transparent)
138138

@@ -275,10 +275,10 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
275275
def Assign(lhs: Tree, rhs: Tree): Assign = new Assign(lhs, rhs)
276276
def Block(stats: List[Tree], expr: Tree): Block = new Block(stats, expr)
277277
def If(cond: Tree, thenp: Tree, elsep: Tree): If = new If(cond, thenp, elsep)
278-
def RewriteIf(cond: Tree, thenp: Tree, elsep: Tree): If = new RewriteIf(cond, thenp, elsep)
278+
def InlineIf(cond: Tree, thenp: Tree, elsep: Tree): If = new InlineIf(cond, thenp, elsep)
279279
def Closure(env: List[Tree], meth: Tree, tpt: Tree): Closure = new Closure(env, meth, tpt)
280280
def Match(selector: Tree, cases: List[CaseDef]): Match = new Match(selector, cases)
281-
def RewriteMatch(selector: Tree, cases: List[CaseDef]): Match = new RewriteMatch(selector, cases)
281+
def InlineMatch(selector: Tree, cases: List[CaseDef]): Match = new InlineMatch(selector, cases)
282282
def CaseDef(pat: Tree, guard: Tree, body: Tree): CaseDef = new CaseDef(pat, guard, body)
283283
def Labeled(bind: Bind, expr: Tree): Labeled = new Labeled(bind, expr)
284284
def Return(expr: Tree, from: Tree): Return = new Return(expr, from)

compiler/src/dotty/tools/dotc/config/ScalaSettings.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class ScalaSettings extends Settings.SettingGroup {
4343
val pageWidth = IntSetting("-pagewidth", "Set page width", 80)
4444
val strict = BooleanSetting("-strict", "Use strict type rules, which means some formerly legal code does not typecheck anymore.")
4545
val language = MultiStringSetting("-language", "feature", "Enable one or more language features.")
46-
val `rewrite` = OptionSetting[Rewrites]("-rewrite", "When used in conjunction with -language:Scala2 rewrites sources to migrate to new syntax")
46+
val rewrite = OptionSetting[Rewrites]("-rewrite", "When used in conjunction with -language:Scala2 rewrites sources to migrate to new syntax")
4747
val silentWarnings = BooleanSetting("-nowarn", "Silence all warnings.")
4848
val fromTasty = BooleanSetting("-from-tasty", "Compile classes from tasty in classpath. The arguments are used as class names.")
4949

compiler/src/dotty/tools/dotc/core/Annotations.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ object Annotations {
5757
}
5858

5959
/** An annotation indicating the body of a right-hand side,
60-
* typically of a rewrite or transparent method. Treated specially in
60+
* typically of an inline or transparent method. Treated specially in
6161
* pickling/unpickling and TypeTreeMaps
6262
*/
6363
abstract class BodyAnnotation extends Annotation {

compiler/src/dotty/tools/dotc/core/Flags.scala

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,8 @@ object Flags {
283283
*/
284284
final val Synthetic = commonFlag(18, "<synthetic>")
285285

286-
/** Labelled with `rewrite` modifier */
287-
final val Rewrite = commonFlag(19, "rewrite")
286+
/** Labelled with `inline` modifier */
287+
final val Inline = commonFlag(19, "inline")
288288

289289
/** A covariant type variable / an outer accessor */
290290
final val CovariantOrOuter = commonFlag(20, "")
@@ -436,7 +436,7 @@ object Flags {
436436

437437
/** Flags representing source modifiers */
438438
final val SourceModifierFlags =
439-
commonFlags(Private, Protected, Abstract, Final, Rewrite | Transparent,
439+
commonFlags(Private, Protected, Abstract, Final, Inline | Transparent,
440440
Sealed, Case, Implicit, Override, AbsOverride, Lazy, JavaStatic, Erased)
441441

442442
/** Flags representing modifiers that can appear in trees */
@@ -457,7 +457,7 @@ object Flags {
457457
Scala2ExistentialCommon | Mutable.toCommonFlags | Touched | JavaStatic |
458458
CovariantOrOuter | ContravariantOrLabel | CaseAccessor.toCommonFlags |
459459
NonMember | ImplicitCommon | Permanent | Synthetic |
460-
SuperAccessorOrScala2x | Rewrite | Transparent
460+
SuperAccessorOrScala2x | Inline | Transparent
461461

462462
/** Flags that are not (re)set when completing the denotation, or, if symbol is
463463
* a top-level class or object, when completing the denotation once the class
@@ -551,8 +551,8 @@ object Flags {
551551
/** Assumed to be pure */
552552
final val StableOrErased = Stable | Erased
553553

554-
/** Labeled `private`, `final`, `rewrite` or `transparent` */
555-
final val EffectivelyFinal = Private | Final | Rewrite | Transparent
554+
/** Labeled `private`, `final`, `inline` or `transparent` */
555+
final val EffectivelyFinal = Private | Final | Inline | Transparent
556556

557557
/** A private method */
558558
final val PrivateMethod = allOf(Private, Method)
@@ -563,11 +563,11 @@ object Flags {
563563
/** A transparent method */
564564
final val TransparentMethod = allOf(Transparent, Method)
565565

566-
/** A rewrite method */
567-
final val RewriteMethod = allOf(Rewrite, Method)
566+
/** An inline method */
567+
final val InlineMethod = allOf(Inline, Method)
568568

569-
/** An implicit rewrite method */
570-
final val ImplicitRewriteMethod = allOf(Rewrite, Implicit, Method)
569+
/** An implicit inline method */
570+
final val ImplicitInlineMethod = allOf(Inline, Implicit, Method)
571571

572572
/** A transparent parameter */
573573
final val TransparentParam = allOf(Transparent, Param)

compiler/src/dotty/tools/dotc/core/Mode.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ object Mode {
9595
/** We are in the IDE */
9696
val Interactive = newMode(20, "Interactive")
9797

98-
/** We are typing the body of a transparent or rewrite method */
98+
/** We are typing the body of a transparent or inline method */
9999
val InlineableBody = newMode(21, "InlineableBody")
100100

101101
/** Read comments from definitions when unpickling from TASTY */

compiler/src/dotty/tools/dotc/core/NameKinds.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,8 @@ object NameKinds {
294294
val SuperArgName = new UniqueNameKind("$superArg$")
295295
val DocArtifactName = new UniqueNameKind("$doc")
296296
val UniqueInlineName = new UniqueNameKind("$i")
297-
val RewriteScrutineeName = new UniqueNameKind("$scrutinee")
298-
val RewriteBinderName = new UniqueNameKind("$elem")
297+
val InlineScrutineeName = new UniqueNameKind("$scrutinee")
298+
val InlineBinderName = new UniqueNameKind("$elem")
299299

300300
/** A kind of unique extension methods; Unlike other unique names, these can be
301301
* unmangled.

compiler/src/dotty/tools/dotc/core/SymDenotations.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -782,14 +782,14 @@ object SymDenotations {
782782
def isTransparentMethod(implicit ctx: Context): Boolean =
783783
is(TransparentMethod, butNot = AccessorOrSynthetic)
784784

785-
def isRewriteMethod(implicit ctx: Context): Boolean =
786-
is(RewriteMethod, butNot = AccessorOrSynthetic)
785+
def isInlineMethod(implicit ctx: Context): Boolean =
786+
is(InlineMethod, butNot = AccessorOrSynthetic)
787787

788-
/** A transparent or rewrite method */
788+
/** A transparent or inline method */
789789
def isInlineable(implicit ctx: Context): Boolean =
790-
is(TransparentMethod) || is(RewriteMethod)
790+
is(TransparentMethod) || is(InlineMethod)
791791

792-
/** An erased value or a rewrite method, excluding @forceInline annotated methods.
792+
/** An erased value or an inline method, excluding @forceInline annotated methods.
793793
* The latter have to be kept around to get to parity with Scala.
794794
* This is necessary at least until we have full bootstrap. Right now
795795
* dotty-bootstrapped involves running the Dotty compiler compiled with Scala 2 with
@@ -799,7 +799,7 @@ object SymDenotations {
799799
*/
800800
def isEffectivelyErased(implicit ctx: Context): Boolean =
801801
is(Erased) ||
802-
isRewriteMethod && unforcedAnnotation(defn.ForceInlineAnnot).isEmpty
802+
isInlineMethod && unforcedAnnotation(defn.ForceInlineAnnot).isEmpty
803803

804804
/** ()T and => T types should be treated as equivalent for this symbol.
805805
* Note: For the moment, we treat Scala-2 compiled symbols as loose matching,

compiler/src/dotty/tools/dotc/core/TypeOps.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,8 @@ trait TypeOps { this: Context => // TODO: Make standalone object.
279279
violations.toList
280280
}
281281

282-
/** Are we in a rewrite method body? */
283-
def inRewriteMethod = owner.ownersIterator.exists(_.isRewriteMethod)
282+
/** Are we in an inline method body? */
283+
def inInlineMethod = owner.ownersIterator.exists(_.isInlineMethod)
284284

285285
/** Is `feature` enabled in class `owner`?
286286
* This is the case if one of the following two alternatives holds:

compiler/src/dotty/tools/dotc/core/tasty/TastyFormat.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,8 @@ Standard-Section: "ASTs" TopLevelStat*
184184
LAZY
185185
OVERRIDE
186186
TRANSPARENT
187-
REWRITE
188-
MACRO // rewrite method containing toplevel splices
187+
INLINE
188+
MACRO // inline method containing toplevel splices
189189
STATIC // mapped to static Java member
190190
OBJECT // an object or its class
191191
TRAIT // a trait
@@ -300,7 +300,7 @@ object TastyFormat {
300300
final val LAZY = 14
301301
final val OVERRIDE = 15
302302
final val TRANSPARENT = 16
303-
final val REWRITE = 17
303+
final val INLINE = 17
304304
final val STATIC = 18
305305
final val OBJECT = 19
306306
final val TRAIT = 20
@@ -482,7 +482,7 @@ object TastyFormat {
482482
| LAZY
483483
| OVERRIDE
484484
| TRANSPARENT
485-
| REWRITE
485+
| INLINE
486486
| MACRO
487487
| STATIC
488488
| OBJECT
@@ -540,7 +540,7 @@ object TastyFormat {
540540
case LAZY => "LAZY"
541541
case OVERRIDE => "OVERRIDE"
542542
case TRANSPARENT => "TRANSPARENT"
543-
case REWRITE => "REWRITE"
543+
case INLINE => "INLINE"
544544
case MACRO => "MACRO"
545545
case STATIC => "STATIC"
546546
case OBJECT => "OBJECT"

compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ class TreePickler(pickler: TastyPickler) {
617617
if (flags is Case) writeByte(CASE)
618618
if (flags is Override) writeByte(OVERRIDE)
619619
if (flags is Transparent) writeByte(TRANSPARENT)
620-
if (flags is Rewrite) writeByte(REWRITE)
620+
if (flags is Inline) writeByte(INLINE)
621621
if (flags is Macro) writeByte(MACRO)
622622
if (flags is JavaStatic) writeByte(STATIC)
623623
if (flags is Module) writeByte(OBJECT)
@@ -782,13 +782,13 @@ class TreePickler(pickler: TastyPickler) {
782782
case If(cond, thenp, elsep) =>
783783
writeByte(IF)
784784
withLength {
785-
if (tree.isInstanceOf[untpd.RewriteIf]) writeByte(REWRITE)
785+
if (tree.isInstanceOf[untpd.InlineIf]) writeByte(INLINE)
786786
pickleUntyped(cond); pickleUntyped(thenp); pickleUntyped(elsep)
787787
}
788788
case Match(selector, cases) =>
789789
writeByte(MATCH)
790790
withLength {
791-
if (tree.isInstanceOf[untpd.RewriteMatch]) writeByte(REWRITE)
791+
if (tree.isInstanceOf[untpd.InlineMatch]) writeByte(INLINE)
792792
pickleUntyped(selector); cases.foreach(pickleUntyped)
793793
}
794794
case CaseDef(pat, guard, rhs) =>

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ class TreeUnpickler(reader: TastyReader,
592592
case LAZY => addFlag(Lazy)
593593
case OVERRIDE => addFlag(Override)
594594
case TRANSPARENT => addFlag(Transparent)
595-
case REWRITE => addFlag(Rewrite)
595+
case INLINE => addFlag(Inline)
596596
case MACRO => addFlag(Macro)
597597
case STATIC => addFlag(JavaStatic)
598598
case OBJECT => addFlag(Module)
@@ -1315,12 +1315,12 @@ class TreeUnpickler(reader: TastyReader,
13151315
val stats = until(end)(readUntyped())
13161316
untpd.Block(stats, expr)
13171317
case IF =>
1318-
val mkIf = if (nextByte == REWRITE) { readByte(); untpd.RewriteIf(_, _, _) }
1318+
val mkIf = if (nextByte == INLINE) { readByte(); untpd.InlineIf(_, _, _) }
13191319
else untpd.If(_, _, _)
13201320
mkIf(readUntyped(), readUntyped(), readUntyped())
13211321
case MATCH =>
13221322
val mkMatch =
1323-
if (nextByte == REWRITE) { readByte(); untpd.RewriteMatch(_, _) }
1323+
if (nextByte == INLINE) { readByte(); untpd.InlineMatch(_, _) }
13241324
else untpd.Match(_, _)
13251325
mkMatch(readUntyped(), readCases(end))
13261326
case CASEDEF =>

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,13 @@ object Parsers {
178178

179179
def isExprIntro =
180180
(canStartExpressionTokens `contains` in.token) &&
181-
(in.token != REWRITE || lookaheadIn(canStartExpressionTokens))
181+
(in.token != INLINE || lookaheadIn(canStartExpressionTokens))
182182

183183
def isDefIntro(allowedMods: BitSet) =
184184
in.token == AT ||
185185
(defIntroTokens `contains` in.token) ||
186186
(allowedMods `contains` in.token) &&
187-
(in.token != REWRITE || lookaheadIn(BitSet(AT) | defIntroTokens | allowedMods))
187+
(in.token != INLINE || lookaheadIn(BitSet(AT) | defIntroTokens | allowedMods))
188188

189189
def isStatSep: Boolean =
190190
in.token == NEWLINE || in.token == NEWLINES || in.token == SEMI
@@ -1103,8 +1103,8 @@ object Parsers {
11031103
* | Expr
11041104
* BlockResult ::= [FunArgMods] FunParams =>' Block
11051105
* | Expr1
1106-
* Expr1 ::= [‘rewrite’] `if' `(' Expr `)' {nl} Expr [[semi] else Expr]
1107-
* | [‘rewrite’] `if' Expr `then' Expr [[semi] else Expr]
1106+
* Expr1 ::= [‘inline’] `if' `(' Expr `)' {nl} Expr [[semi] else Expr]
1107+
* | [‘inline’] `if' Expr `then' Expr [[semi] else Expr]
11081108
* | `while' `(' Expr `)' {nl} Expr
11091109
* | `while' Expr `do' Expr
11101110
* | `do' Expr [semi] `while' Expr
@@ -1116,7 +1116,7 @@ object Parsers {
11161116
* | [SimpleExpr `.'] id `=' Expr
11171117
* | SimpleExpr1 ArgumentExprs `=' Expr
11181118
* | PostfixExpr [Ascription]
1119-
* | [‘rewrite’] PostfixExpr `match' `{' CaseClauses `}'
1119+
* | [‘inline’] PostfixExpr `match' `{' CaseClauses `}'
11201120
* | `implicit' `match' `{' ImplicitCaseClauses `}'
11211121
* Bindings ::= `(' [Binding {`,' Binding}] `)'
11221122
* Binding ::= (id | `_') [`:' Type]
@@ -1212,14 +1212,14 @@ object Parsers {
12121212
atPos(in.skipToken()) { Return(if (isExprIntro) expr() else EmptyTree, EmptyTree) }
12131213
case FOR =>
12141214
forExpr()
1215-
case REWRITE =>
1215+
case INLINE =>
12161216
val start = in.skipToken()
12171217
in.token match {
12181218
case IF =>
1219-
ifExpr(start, RewriteIf)
1219+
ifExpr(start, InlineIf)
12201220
case _ =>
12211221
val t = postfixExpr()
1222-
if (in.token == MATCH) matchExpr(t, start, RewriteMatch)
1222+
if (in.token == MATCH) matchExpr(t, start, InlineMatch)
12231223
else {
12241224
syntaxErrorOrIncomplete("`match` or `if` expected but ${in.token} found")
12251225
t
@@ -1304,7 +1304,7 @@ object Parsers {
13041304
case mods => markFirstIllegal(mods)
13051305
}
13061306
val result @ Match(t, cases) =
1307-
matchExpr(ImplicitScrutinee().withPos(implicitKwPos(start)), start, RewriteMatch)
1307+
matchExpr(ImplicitScrutinee().withPos(implicitKwPos(start)), start, InlineMatch)
13081308
for (CaseDef(pat, _, _) <- cases) {
13091309
def isImplicitPattern(pat: Tree) = pat match {
13101310
case Typed(pat1, _) => isVarPattern(pat1)
@@ -1776,7 +1776,7 @@ object Parsers {
17761776
case FINAL => Mod.Final()
17771777
case IMPLICIT => Mod.Implicit()
17781778
case ERASED => Mod.Erased()
1779-
case REWRITE => Mod.Rewrite()
1779+
case INLINE => Mod.Inline()
17801780
case TRANSPARENT => Mod.Transparent()
17811781
case LAZY => Mod.Lazy()
17821782
case OVERRIDE => Mod.Override()
@@ -1888,7 +1888,10 @@ object Parsers {
18881888
*/
18891889
def annot() =
18901890
adjustStart(accept(AT)) {
1891-
ensureApplied(parArgumentExprss(wrapNew(simpleType())))
1891+
val tpe =
1892+
if (in.token == INLINE) atPos(in.skipToken()) { BackquotedIdent(tpnme.INLINEkw) }
1893+
else simpleType()
1894+
ensureApplied(parArgumentExprss(wrapNew(tpe)))
18921895
}
18931896

18941897
def annotations(skipNewLines: Boolean = false): List[Tree] = {

0 commit comments

Comments
 (0)