Unverified Commit 92e02457 authored by Ahmed Ashour's avatar Ahmed Ashour Committed by GitHub

Handle reserved Kotlin keywords (#86518)

parent 2971bf65
......@@ -13,6 +13,12 @@ import 'base/template.dart';
import 'cache.dart';
import 'dart/package_map.dart';
/// The Kotlin keywords which are not Java keywords.
/// They are escaped in Kotlin files.
///
/// https://kotlinlang.org/docs/keyword-reference.html
const List<String> kReservedKotlinKeywords = <String>['when', 'in'];
/// Expands templates in a directory to a destination. All files that must
/// undergo template expansion should end with the '.tmpl' extension. All files
/// that should be replaced with the corresponding image from
......@@ -322,6 +328,11 @@ class Template {
if (sourceFile.path.endsWith(templateExtension)) {
final String templateContents = sourceFile.readAsStringSync();
final String? androidIdentifier = context['androidIdentifier'] as String?;
if (finalDestinationFile.path.endsWith('.kt') && androidIdentifier != null) {
context['androidIdentifier'] = _escapeKotlinKeywords(androidIdentifier);
}
final String renderedContents = _templateRenderer.renderString(templateContents, context);
finalDestinationFile.writeAsStringSync(renderedContents);
......@@ -360,3 +371,11 @@ Future<Directory> _templateImageDirectory(String name, FileSystem fileSystem, Lo
.childDirectory('templates')
.childDirectory(name);
}
String _escapeKotlinKeywords(String androidIdentifier) {
final List<String> segments = androidIdentifier.split('.');
final List<String> correctedSegments = segments.map(
(String segment) => kReservedKotlinKeywords.contains(segment) ? '`$segment`' : segment
).toList();
return correctedSegments.join('.');
}
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/isolated/mustache_template.dart';
import 'package:flutter_tools/src/template.dart';
import '../../src/common.dart';
void main() {
testWithoutContext('kotlin reserved keywords', () {
final FileSystem fileSystem = MemoryFileSystem.test();
final BufferLogger logger = BufferLogger.test();
final Directory rootDir = fileSystem.currentDirectory;
final Directory templateSource = rootDir.childDirectory('src');
final Directory imageSourceDir = templateSource;
final Directory destination = rootDir.childDirectory('dest');
const String outputClass = 'SomeClass.kt';
final File sourceFile = templateSource.childFile('$outputClass.tmpl');
templateSource.createSync();
sourceFile.writeAsStringSync('package {{androidIdentifier}};');
final Template template = Template(
templateSource,
imageSourceDir,
fileSystem: fileSystem,
logger: logger,
templateRenderer: const MustacheTemplateRenderer(),
templateManifest: null
);
final Map<String, Object> context = <String, Object>{
'androidIdentifier': 'in.when.there'
};
template.render(destination, context);
final File destinationFile = destination.childFile(outputClass);
expect(destinationFile.readAsStringSync(), equals('package `in`.`when`.there;'));
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment