blob: 00b606ac1a5da2e1abd69e0d9df27154d88c2107 [file] [log] [blame]
Chris Lattnerda59c2f2006-11-05 02:08:13 +00001//===--- ParseObjc.cpp - Objective C Parsing ------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by Steve Naroff and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Objective-C portions of the Parser interface.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Parse/Parser.h"
15#include "clang/Basic/Diagnostic.h"
16#include "llvm/ADT/SmallVector.h"
Chris Lattnerda59c2f2006-11-05 02:08:13 +000017using namespace clang;
18
19
20/// ParseExternalDeclaration:
21/// external-declaration: [C99 6.9]
22/// [OBJC] objc-class-definition
23/// [OBJC] objc-class-declaration [TODO]
24/// [OBJC] objc-alias-declaration [TODO]
25/// [OBJC] objc-protocol-definition [TODO]
26/// [OBJC] objc-method-definition [TODO]
27/// [OBJC] '@' 'end' [TODO]
Chris Lattnerb26b6652006-11-08 06:10:32 +000028void Parser::ParseObjCAtDirectives() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000029 SourceLocation AtLoc = ConsumeToken(); // the "@"
30
31 IdentifierInfo *II = Tok.getIdentifierInfo();
32 switch (II ? II->getObjCKeywordID() : tok::objc_not_keyword) {
33 case tok::objc_class:
Chris Lattnerb26b6652006-11-08 06:10:32 +000034 return ParseObjCAtClassDeclaration(AtLoc);
Chris Lattnerda59c2f2006-11-05 02:08:13 +000035 case tok::objc_interface:
Chris Lattnerb26b6652006-11-08 06:10:32 +000036 return ParseObjCAtInterfaceDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000037 case tok::objc_protocol:
Chris Lattnerb26b6652006-11-08 06:10:32 +000038 return ParseObjCAtProtocolDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000039 case tok::objc_implementation:
Chris Lattnerb26b6652006-11-08 06:10:32 +000040 return ParseObjCAtImplementationDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000041 case tok::objc_end:
Chris Lattnerb26b6652006-11-08 06:10:32 +000042 return ParseObjCAtEndDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000043 case tok::objc_compatibility_alias:
Chris Lattnerb26b6652006-11-08 06:10:32 +000044 return ParseObjCAtAliasDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000045 default:
46 Diag(AtLoc, diag::err_unexpected_at);
47 SkipUntil(tok::semi);
48 }
49}
50
51///
52/// objc-class-declaration:
53/// '@' 'class' identifier-list ';'
54///
Chris Lattnerb26b6652006-11-08 06:10:32 +000055void Parser::ParseObjCAtClassDeclaration(SourceLocation atLoc) {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000056 ConsumeToken(); // the identifier "class"
Chris Lattner23b7eb62007-06-15 23:05:46 +000057 llvm::SmallVector<IdentifierInfo *, 8> ClassNames;
Chris Lattnerda59c2f2006-11-05 02:08:13 +000058
59 while (1) {
60 if (Tok.getKind() != tok::identifier) {
Chris Lattnerbd638922006-11-10 05:19:25 +000061 Diag(Tok, diag::err_expected_ident);
Chris Lattnerda59c2f2006-11-05 02:08:13 +000062 SkipUntil(tok::semi);
63 return;
64 }
65
66 ClassNames.push_back(Tok.getIdentifierInfo());
67 ConsumeToken();
68
69 if (Tok.getKind() != tok::comma)
70 break;
71
72 ConsumeToken();
73 }
74
75 // Consume the ';'.
76 if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@class"))
77 return;
78
Chris Lattner94c22cd2006-11-19 02:35:21 +000079 Actions.ParsedObjcClassDeclaration(CurScope,
80 &ClassNames[0], ClassNames.size());
Chris Lattnerda59c2f2006-11-05 02:08:13 +000081}
82
Chris Lattnerb26b6652006-11-08 06:10:32 +000083void Parser::ParseObjCAtInterfaceDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000084 assert(0 && "Unimp");
85}
Chris Lattnerb26b6652006-11-08 06:10:32 +000086void Parser::ParseObjCAtProtocolDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000087 assert(0 && "Unimp");
88}
Chris Lattnerb26b6652006-11-08 06:10:32 +000089void Parser::ParseObjCAtImplementationDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000090 assert(0 && "Unimp");
91}
Chris Lattnerb26b6652006-11-08 06:10:32 +000092void Parser::ParseObjCAtEndDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000093 assert(0 && "Unimp");
94}
Chris Lattnerb26b6652006-11-08 06:10:32 +000095void Parser::ParseObjCAtAliasDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000096 assert(0 && "Unimp");
97}
98
Chris Lattnerb26b6652006-11-08 06:10:32 +000099void Parser::ParseObjCInstanceMethodDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +0000100 assert(0 && "Unimp");
101}
102
Chris Lattnerb26b6652006-11-08 06:10:32 +0000103void Parser::ParseObjCClassMethodDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +0000104 assert(0 && "Unimp");
105}