Skip to content

Commit ff5b879

Browse files
authored
Merge pull request #3336 from IngmarStein/master
[ClangImporter] Import macros with cast to builtin type
2 parents 98829a2 + baeb382 commit ff5b879

File tree

6 files changed

+78
-15
lines changed

6 files changed

+78
-15
lines changed

Diff for: lib/ClangImporter/ImportMacro.cpp

+61-14
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,44 @@ static bool isSignToken(const clang::Token &tok) {
259259
tok.is(clang::tok::tilde);
260260
}
261261

262+
static Optional<clang::QualType> builtinTypeForToken(const clang::Token &tok,
263+
const clang::ASTContext &context) {
264+
switch (tok.getKind()) {
265+
case clang::tok::kw_short:
266+
return clang::QualType(context.ShortTy);
267+
case clang::tok::kw_long:
268+
return clang::QualType(context.LongTy);
269+
case clang::tok::kw___int64:
270+
return clang::QualType(context.LongLongTy);
271+
case clang::tok::kw___int128:
272+
return clang::QualType(context.Int128Ty);
273+
case clang::tok::kw_signed:
274+
return clang::QualType(context.IntTy);
275+
case clang::tok::kw_unsigned:
276+
return clang::QualType(context.UnsignedIntTy);
277+
case clang::tok::kw_void:
278+
return clang::QualType(context.VoidTy);
279+
case clang::tok::kw_char:
280+
return clang::QualType(context.CharTy);
281+
case clang::tok::kw_int:
282+
return clang::QualType(context.IntTy);
283+
case clang::tok::kw_float:
284+
return clang::QualType(context.FloatTy);
285+
case clang::tok::kw_double:
286+
return clang::QualType(context.DoubleTy);
287+
case clang::tok::kw_wchar_t:
288+
return clang::QualType(context.WCharTy);
289+
case clang::tok::kw_bool:
290+
return clang::QualType(context.BoolTy);
291+
case clang::tok::kw_char16_t:
292+
return clang::QualType(context.Char16Ty);
293+
case clang::tok::kw_char32_t:
294+
return clang::QualType(context.Char32Ty);
295+
default:
296+
return llvm::None;
297+
}
298+
}
299+
262300
static ValueDecl *importMacro(ClangImporter::Implementation &impl,
263301
DeclContext *DC,
264302
Identifier name,
@@ -284,27 +322,36 @@ static ValueDecl *importMacro(ClangImporter::Implementation &impl,
284322
clang::QualType castClangType;
285323
if (numTokens > 3 &&
286324
tokenI[0].is(clang::tok::l_paren) &&
287-
tokenI[1].is(clang::tok::identifier) &&
325+
(tokenI[1].is(clang::tok::identifier) ||
326+
impl.getClangSema().isSimpleTypeSpecifier(tokenI[1].getKind())) &&
288327
tokenI[2].is(clang::tok::r_paren)) {
289328
if (castType) {
290329
// this is a nested cast
291330
return nullptr;
292331
}
293332

294-
auto identifierInfo = tokenI[1].getIdentifierInfo();
295-
if (identifierInfo->isStr("id")) {
296-
castTypeIsId = true;
297-
}
298-
auto identifierName = identifierInfo->getName();
299-
auto &identifier = impl.getClangASTContext().Idents.get(identifierName);
300-
auto parsedType = impl.getClangSema().getTypeName(identifier,
301-
clang::SourceLocation(),
302-
/*scope*/nullptr);
303-
if (parsedType) {
304-
castClangType = parsedType.get();
305-
castType = &castClangType;
333+
if (tokenI[1].is(clang::tok::identifier)) {
334+
auto identifierInfo = tokenI[1].getIdentifierInfo();
335+
if (identifierInfo->isStr("id")) {
336+
castTypeIsId = true;
337+
}
338+
auto identifierName = identifierInfo->getName();
339+
auto &identifier = impl.getClangASTContext().Idents.get(identifierName);
340+
auto parsedType = impl.getClangSema().getTypeName(identifier,
341+
clang::SourceLocation(),
342+
/*scope*/nullptr);
343+
if (parsedType) {
344+
castClangType = parsedType.get();
345+
castType = &castClangType;
346+
} else {
347+
return nullptr;
348+
}
306349
} else {
307-
return nullptr;
350+
auto builtinType = builtinTypeForToken(tokenI[1],
351+
impl.getClangASTContext());
352+
if (builtinType) {
353+
castType = &builtinType.getValue();
354+
}
308355
}
309356
tokenI += 3;
310357
numTokens -= 3;

Diff for: test/IDE/Inputs/mock-sdk/Foo.annotated.txt

+4
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ class <loc>FooClassDerived</loc> : <ref:Class>FooClassBase</ref>, <ref:Protocol>
189189
<decl:Var>var <loc>FOO_MACRO_5</loc>: <ref:Struct>UInt64</ref> { get }</decl>
190190
<decl:Var>var <loc>FOO_MACRO_6</loc>: <ref:TypeAlias>typedef_int_t</ref> { get }</decl>
191191
<decl:Var>var <loc>FOO_MACRO_7</loc>: <ref:TypeAlias>typedef_int_t</ref> { get }</decl>
192+
<decl:Var>var <loc>FOO_MACRO_8</loc>: <ref:Struct>Int8</ref> { get }</decl>
193+
<decl:Var>var <loc>FOO_MACRO_9</loc>: <ref:Struct>Int32</ref> { get }</decl>
194+
<decl:Var>var <loc>FOO_MACRO_10</loc>: <ref:Struct>Int16</ref> { get }</decl>
195+
<decl:Var>var <loc>FOO_MACRO_11</loc>: <ref:Struct>Int</ref> { get }</decl>
192196
<decl:Var>var <loc>FOO_MACRO_OR</loc>: <ref:Struct>Int32</ref> { get }</decl>
193197
<decl:Var>var <loc>FOO_MACRO_AND</loc>: <ref:Struct>Int32</ref> { get }</decl>
194198
<decl:Var>var <loc>FOO_MACRO_REDEF_1</loc>: <ref:Struct>Int32</ref> { get }</decl>

Diff for: test/IDE/Inputs/mock-sdk/Foo.framework/Headers/Foo.h

+4
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@ typedef int typedef_int_t;
190190
#define FOO_MACRO_5 0xffffffffffffffffull
191191
#define FOO_MACRO_6 ((typedef_int_t) 42)
192192
#define FOO_MACRO_7 ((typedef_int_t) -1)
193+
#define FOO_MACRO_8 ((char) 8)
194+
#define FOO_MACRO_9 ((int) 9)
195+
#define FOO_MACRO_10 ((short) 10)
196+
#define FOO_MACRO_11 ((long) 11)
193197
#define FOO_MACRO_OR (FOO_MACRO_2 | FOO_MACRO_6)
194198
#define FOO_MACRO_AND (FOO_MACRO_2 & FOO_MACRO_6)
195199
#define FOO_MACRO_BITWIDTH (FOO_MACRO_4 & FOO_MACRO_5)

Diff for: test/IDE/Inputs/mock-sdk/Foo.printed.recursive.txt

+4
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ var FOO_MACRO_4: UInt32 { get }
189189
var FOO_MACRO_5: UInt64 { get }
190190
var FOO_MACRO_6: typedef_int_t { get }
191191
var FOO_MACRO_7: typedef_int_t { get }
192+
var FOO_MACRO_8: Int8 { get }
193+
var FOO_MACRO_9: Int32 { get }
194+
var FOO_MACRO_10: Int16 { get }
195+
var FOO_MACRO_11: Int { get }
192196
var FOO_MACRO_OR: Int32 { get }
193197
var FOO_MACRO_AND: Int32 { get }
194198
var FOO_MACRO_REDEF_1: Int32 { get }

Diff for: test/IDE/Inputs/mock-sdk/Foo.printed.txt

+4
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ var FOO_MACRO_4: UInt32 { get }
227227
var FOO_MACRO_5: UInt64 { get }
228228
var FOO_MACRO_6: typedef_int_t { get }
229229
var FOO_MACRO_7: typedef_int_t { get }
230+
var FOO_MACRO_8: Int8 { get }
231+
var FOO_MACRO_9: Int32 { get }
232+
var FOO_MACRO_10: Int16 { get }
233+
var FOO_MACRO_11: Int { get }
230234
var FOO_MACRO_OR: Int32 { get }
231235
var FOO_MACRO_AND: Int32 { get }
232236

Diff for: test/IDE/complete_from_clang_framework.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ func testCompleteModuleQualifiedFoo2() {
146146
Foo#^CLANG_QUAL_FOO_2^#
147147
// If the number of results below changes, then you need to add a result to the
148148
// list below.
149-
// CLANG_QUAL_FOO_2: Begin completions, 69 items
149+
// CLANG_QUAL_FOO_2: Begin completions, 73 items
150150
// CLANG_QUAL_FOO_2-DAG: Decl[Class]/OtherModule[Foo]: .FooClassBase[#FooClassBase#]{{; name=.+$}}
151151
// CLANG_QUAL_FOO_2-DAG: Decl[Class]/OtherModule[Foo]: .FooClassDerived[#FooClassDerived#]{{; name=.+$}}
152152
// CLANG_QUAL_FOO_2-DAG: Decl[Class]/OtherModule[Foo]: .ClassWithInternalProt[#ClassWithInternalProt#]{{; name=.+$}}

0 commit comments

Comments
 (0)