message: avoid duplicated trace
diff: @@ -54,6 +54,7 @@ export default function tracer(
  return (sourceFile: ts.SourceFile) => {
  const sourceFullText = sourceFile.getFullText()
  const traceF = factory.createUniqueName("trace")
  + const traced = new Set<string>()
  const regions = sourceFullText
  .split("\n")
  @@ -304,9 +305,7 @@ export default function tracer(
  }
  if (ts.isClassDeclaration(node) && node.name) {
  - const forcedTrace = /@trace/.test(node.getFullText())
  -
  - if (isTracing || forcedTrace) {
  + if (isTracing) {
  const members: [ts.Identifier, ts.StringLiteral][] = []
  node.members.forEach((m) => {
  @@ -357,9 +356,7 @@ export default function tracer(
  }
  if (ts.isArrowFunction(node)) {
  - const forcedTrace = /@trace/.test(node.getFullText())
  -
  - if (isTracing || forcedTrace) {
  + if (isTracing) {
  const { character, line } = sourceFile.getLineAndCharacterOfPosition(
  node.body?.getStart() || node.getStart()
  )
  @@ -380,9 +377,11 @@ export default function tracer(
  }
  if (ts.isFunctionExpression(node)) {
  - const forcedTrace = /@trace/.test(node.getFullText())
  -
  - if (isTracing || forcedTrace) {
  + if (isTracing) {
  + if ((node.name && !traced.has(node.name.getText())) || !node.name) {
  + if (node.name) {
  + traced.add(node.name.getText())
  + }
  const { character, line } = sourceFile.getLineAndCharacterOfPosition(
  node.body?.getStart() || node.getStart()
  )
  @@ -400,11 +399,14 @@ export default function tracer(
  ])
  }
  }
  + }
  if (ts.isFunctionDeclaration(node) && tracingOn) {
  - const forcedTrace = /@trace/.test(node.getFullText())
  -
  - if (isTracing || forcedTrace) {
  + if (isTracing) {
  + if ((node.name && !traced.has(node.name.getText())) || !node.name) {
  + if (node.name) {
  + traced.add(node.name.getText())
  + }
  const { character, line } = sourceFile.getLineAndCharacterOfPosition(
  node.body?.getStart() || node.getStart()
  )
  @@ -423,6 +425,7 @@ export default function tracer(
  }
  }
  }
  + }
  return ts.visitEachChild(node, visitor, ctx)
  }
  