blob: 16e9216d857ad1ddd761b74b10556f1b1dd622d7 [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"
17using namespace llvm;
18using namespace clang;
19
20
21/// ParseExternalDeclaration:
22/// external-declaration: [C99 6.9]
23/// [OBJC] objc-class-definition
24/// [OBJC] objc-class-declaration [TODO]
25/// [OBJC] objc-alias-declaration [TODO]
26/// [OBJC] objc-protocol-definition [TODO]
27/// [OBJC] objc-method-definition [TODO]
28/// [OBJC] '@' 'end' [TODO]
Chris Lattnerb26b6652006-11-08 06:10:32 +000029void Parser::ParseObjCAtDirectives() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000030 SourceLocation AtLoc = ConsumeToken(); // the "@"
31
32 IdentifierInfo *II = Tok.getIdentifierInfo();
33 switch (II ? II->getObjCKeywordID() : tok::objc_not_keyword) {
34 case tok::objc_class:
Chris Lattnerb26b6652006-11-08 06:10:32 +000035 return ParseObjCAtClassDeclaration(AtLoc);
Chris Lattnerda59c2f2006-11-05 02:08:13 +000036 case tok::objc_interface:
Chris Lattnerb26b6652006-11-08 06:10:32 +000037 return ParseObjCAtInterfaceDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000038 case tok::objc_protocol:
Chris Lattnerb26b6652006-11-08 06:10:32 +000039 return ParseObjCAtProtocolDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000040 case tok::objc_implementation:
Chris Lattnerb26b6652006-11-08 06:10:32 +000041 return ParseObjCAtImplementationDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000042 case tok::objc_end:
Chris Lattnerb26b6652006-11-08 06:10:32 +000043 return ParseObjCAtEndDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000044 case tok::objc_compatibility_alias:
Chris Lattnerb26b6652006-11-08 06:10:32 +000045 return ParseObjCAtAliasDeclaration();
Chris Lattnerda59c2f2006-11-05 02:08:13 +000046 default:
47 Diag(AtLoc, diag::err_unexpected_at);
48 SkipUntil(tok::semi);
49 }
50}
51
52///
53/// objc-class-declaration:
54/// '@' 'class' identifier-list ';'
55///
Chris Lattnerb26b6652006-11-08 06:10:32 +000056void Parser::ParseObjCAtClassDeclaration(SourceLocation atLoc) {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000057 ConsumeToken(); // the identifier "class"
58 SmallVector<IdentifierInfo *, 8> ClassNames;
59
60 while (1) {
61 if (Tok.getKind() != tok::identifier) {
Chris Lattnerbd638922006-11-10 05:19:25 +000062 Diag(Tok, diag::err_expected_ident);
Chris Lattnerda59c2f2006-11-05 02:08:13 +000063 SkipUntil(tok::semi);
64 return;
65 }
66
67 ClassNames.push_back(Tok.getIdentifierInfo());
68 ConsumeToken();
69
70 if (Tok.getKind() != tok::comma)
71 break;
72
73 ConsumeToken();
74 }
75
76 // Consume the ';'.
77 if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@class"))
78 return;
79
Chris Lattner94c22cd2006-11-19 02:35:21 +000080 Actions.ParsedObjcClassDeclaration(CurScope,
81 &ClassNames[0], ClassNames.size());
Chris Lattnerda59c2f2006-11-05 02:08:13 +000082}
83
Chris Lattnerb26b6652006-11-08 06:10:32 +000084void Parser::ParseObjCAtInterfaceDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000085 assert(0 && "Unimp");
86}
Chris Lattnerb26b6652006-11-08 06:10:32 +000087void Parser::ParseObjCAtProtocolDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000088 assert(0 && "Unimp");
89}
Chris Lattnerb26b6652006-11-08 06:10:32 +000090void Parser::ParseObjCAtImplementationDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000091 assert(0 && "Unimp");
92}
Chris Lattnerb26b6652006-11-08 06:10:32 +000093void Parser::ParseObjCAtEndDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000094 assert(0 && "Unimp");
95}
Chris Lattnerb26b6652006-11-08 06:10:32 +000096void Parser::ParseObjCAtAliasDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +000097 assert(0 && "Unimp");
98}
99
Chris Lattnerb26b6652006-11-08 06:10:32 +0000100void Parser::ParseObjCInstanceMethodDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +0000101 assert(0 && "Unimp");
102}
103
Chris Lattnerb26b6652006-11-08 06:10:32 +0000104void Parser::ParseObjCClassMethodDeclaration() {
Chris Lattnerda59c2f2006-11-05 02:08:13 +0000105 assert(0 && "Unimp");
106}