mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Raw identifiers are backtick-delimited identifiers that can contain any non-identifier character other than the backtick itself, CR, LF, or other non-printable ASCII code units, and which are also not composed entirely of operator characters.
94 lines
2.6 KiB
C++
94 lines
2.6 KiB
C++
//===--- ManglingUtils.cpp - Utilities for Swift name mangling ------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/Demangling/ManglingUtils.h"
|
|
#include <optional>
|
|
|
|
using namespace swift;
|
|
using namespace Mangle;
|
|
|
|
|
|
bool Mangle::isNonAscii(StringRef str) {
|
|
for (unsigned char c : str) {
|
|
if (c >= 0x80)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool Mangle::needsPunycodeEncoding(StringRef str) {
|
|
if (str.empty()) {
|
|
return false;
|
|
}
|
|
if (!isValidSymbolStart(str.front())) {
|
|
return true;
|
|
}
|
|
for (unsigned char c : str.substr(1)) {
|
|
if (!isValidSymbolChar(c)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// Translate the given operator character into its mangled form.
|
|
///
|
|
/// Current operator characters: @/=-+*%<>!&|^~ and the special operator '..'
|
|
char Mangle::translateOperatorChar(char op) {
|
|
switch (op) {
|
|
case '&': return 'a'; // 'and'
|
|
case '@': return 'c'; // 'commercial at sign'
|
|
case '/': return 'd'; // 'divide'
|
|
case '=': return 'e'; // 'equal'
|
|
case '>': return 'g'; // 'greater'
|
|
case '<': return 'l'; // 'less'
|
|
case '*': return 'm'; // 'multiply'
|
|
case '!': return 'n'; // 'negate'
|
|
case '|': return 'o'; // 'or'
|
|
case '+': return 'p'; // 'plus'
|
|
case '?': return 'q'; // 'question'
|
|
case '%': return 'r'; // 'remainder'
|
|
case '-': return 's'; // 'subtract'
|
|
case '~': return 't'; // 'tilde'
|
|
case '^': return 'x'; // 'xor'
|
|
case '.': return 'z'; // 'zperiod' (the z is silent)
|
|
default:
|
|
return op;
|
|
}
|
|
}
|
|
|
|
std::string Mangle::translateOperator(StringRef Op) {
|
|
std::string Encoded;
|
|
for (char ch : Op) {
|
|
Encoded.push_back(translateOperatorChar(ch));
|
|
}
|
|
return Encoded;
|
|
}
|
|
|
|
std::optional<StringRef>
|
|
Mangle::getStandardTypeSubst(StringRef TypeName,
|
|
bool allowConcurrencyManglings) {
|
|
#define STANDARD_TYPE(KIND, MANGLING, TYPENAME) \
|
|
if (TypeName == #TYPENAME) { \
|
|
return StringRef(#MANGLING); \
|
|
}
|
|
|
|
#define STANDARD_TYPE_CONCURRENCY(KIND, MANGLING, TYPENAME) \
|
|
if (allowConcurrencyManglings && TypeName == #TYPENAME) { \
|
|
return StringRef("c" #MANGLING); \
|
|
}
|
|
|
|
#include "swift/Demangling/StandardTypesMangling.def"
|
|
|
|
return std::nullopt;
|
|
}
|