Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Side by Side Diff: runtime/bin/vmservice/client/lib/src/service/object.dart

Issue 361743002: observatory/vm: add support for computing/passing end tokens on classes (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of service; 5 part of service;
6 6
7 /// A [ServiceObject] is an object known to the VM service and is tied 7 /// A [ServiceObject] is an object known to the VM service and is tied
8 /// to an owning [Isolate]. 8 /// to an owning [Isolate].
9 abstract class ServiceObject extends Observable { 9 abstract class ServiceObject extends Observable {
10 /// The owner of this [ServiceObject]. This can be an [Isolate], a 10 /// The owner of this [ServiceObject]. This can be an [Isolate], a
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 void update(List stats) { 1096 void update(List stats) {
1097 accumulated.instances = stats[ACCUMULATED]; 1097 accumulated.instances = stats[ACCUMULATED];
1098 accumulated.bytes = stats[ACCUMULATED_SIZE]; 1098 accumulated.bytes = stats[ACCUMULATED_SIZE];
1099 current.instances = stats[LIVE_AFTER_GC] + stats[ALLOCATED_SINCE_GC]; 1099 current.instances = stats[LIVE_AFTER_GC] + stats[ALLOCATED_SINCE_GC];
1100 current.bytes = stats[LIVE_AFTER_GC_SIZE] + stats[ALLOCATED_SINCE_GC_SIZE]; 1100 current.bytes = stats[LIVE_AFTER_GC_SIZE] + stats[ALLOCATED_SINCE_GC_SIZE];
1101 } 1101 }
1102 1102
1103 bool get empty => accumulated.empty && current.empty; 1103 bool get empty => accumulated.empty && current.empty;
1104 } 1104 }
1105 1105
1106 class ClassParser {
hausner 2014/07/01 23:49:07 When we spoke offline I was under the impression t
1107 List<ScriptLine> _source;
1108 int _offset;
1109
1110 ClassParser(this._source) {
1111 assert(_source != null && _source.length > 0);
1112 _offset = this._source.first.line;
1113 }
1114
1115 // Internal state for parsing the class.
1116 var _line;
1117 var _col;
1118 int _currentToken;
1119
1120 int _char(String str) => str.codeUnitAt(0);
1121
1122 void _initTokens() {
1123 _line = 0;
1124 _col = 0;
1125 _currentToken = _source[_line].text.codeUnitAt(_col);
1126 }
1127
1128 int _advanceToken([int num, stripWhite=true]) {
1129 _col++;
1130 if (_col >= _source[_line].text.codeUnits.length) {
1131 var col = _col;
1132 _col = 0;
1133 _line++;
1134 if (_line == _source.length) {
1135 _line--;
1136 _col = col;
1137 _currentToken = 0;
1138 return 0;
1139 }
1140 }
1141
1142 while (_source[_line].text.length == 0) { _line++; }
1143 _currentToken = _source[_line].text.codeUnitAt(_col);
1144 if (stripWhite && _currentToken == _char(' ')) {
1145 _advanceToken();
1146 }
1147 if (num != null) {
1148 for (int i = 1; i < num; i++) {
1149 _advanceToken();
1150 }
1151 }
1152 return _currentToken;
1153 }
1154
1155 int _peek(int len, [stripWhite=true]) {
1156 int saved_line = _line;
1157 int saved_col = _col;
1158 int c = _advanceToken(len,stripWhite);
1159 _line = saved_line;
1160 _col = saved_col;
1161 return c;
1162 }
1163
1164 void _consumeMultilineString(int quote) {
1165 _advanceToken(3);
1166 for (int c = _currentToken; c != 0; c = _advanceToken()) {
1167 if (c == quote && _peek(1) == quote && _peek(2) == quote) {
1168 _advanceToken(3);
1169 break;
1170 }
1171 }
1172 }
1173
1174 void _consumeString(int quote) {
1175 _advanceToken();
1176 for (int c = _currentToken; c != 0; c = _advanceToken()) {
1177 if (c == _char('\\')) {
1178 _advanceToken();
1179 }
1180 if (c == quote) {
1181 _advanceToken();
1182 break;
1183 }
1184 }
1185 }
1186
1187 void _consumeComment() {
1188 _col = _source[_line].text.codeUnits.length;
1189 }
1190
1191 void _consumeMultilineComment() {
1192 _advanceToken(2);
1193 int commentLevel = 1;
1194 for (int c = _currentToken; c != 0; c = _advanceToken()) {
1195 if (c == _char('/') && _peek(1, false) == _char('*')) {
1196 commentLevel++;
1197 _advanceToken();
1198 } else if (c == _char('*') && _peek(1, false) == _char('/')) {
1199 commentLevel--;
1200 _advanceToken();
1201 if (commentLevel == 0) {
1202 _advanceToken();
1203 break;
1204 }
1205 }
1206 }
1207 }
1208
1209 /// Finds the end position, i.e., the closing curly brackets of the given
1210 /// class.
1211 /// Returns a tuple [line, col].
1212 List findEndPos() {
1213 int level = 0;
1214 _initTokens();
1215 for (int c = _currentToken; c != 0; c=_currentToken) {
1216 if ((c == _char("'") &&
1217 _peek(1) == _char("'") &&
1218 _peek(2) == _char("'")) ||
1219 (c == _char('"') &&
1220 _peek(1) == _char('"') &&
1221 _peek(2) == _char('"'))) {
1222 _consumeMultilineString(c);
1223 continue;
1224 } else if (c == _char("'") || c == _char('"')) {
1225 _consumeString(c);
1226 continue;
1227 } else if (c == _char('/') && _peek(1, false) == _char('/')) {
1228 _consumeComment();
1229 continue;
1230 } else if (c == _char('/') && _peek(1, false) == _char('*')) {
1231 _consumeMultilineComment();
1232 continue;
1233 } else if (c == _char('{')) {
1234 level++;
1235 } else if (c == _char('}')) {
1236 if (--level == 0) {
1237 break;
1238 }
1239 }
1240 c = _advanceToken();
1241 }
1242 return [_line + _offset, _col + 1];
1243 }
1244 }
1245
1106 class Class extends ServiceObject with Coverage { 1246 class Class extends ServiceObject with Coverage {
1107 @observable Library library; 1247 @observable Library library;
1108 @observable Script script; 1248 @observable Script script;
1109 @observable Class superClass; 1249 @observable Class superClass;
1110 1250
1111 @observable bool isAbstract; 1251 @observable bool isAbstract;
1112 @observable bool isConst; 1252 @observable bool isConst;
1113 @observable bool isFinalized; 1253 @observable bool isFinalized;
1114 @observable bool isPatch; 1254 @observable bool isPatch;
1115 @observable bool isImplemented; 1255 @observable bool isImplemented;
1116 1256
1117 @observable int tokenPos; 1257 @observable int tokenPos;
1118 1258
1259 int _endTokenPos = null;
1260 @observable int get endTokenPos {
1261 if (_endTokenPos == null) {
1262 _computeEndTokenPos();
1263 }
1264 return _endTokenPos;
1265 }
1266
1119 @observable ServiceMap error; 1267 @observable ServiceMap error;
1120 1268
1121 final Allocations newSpace = new Allocations(); 1269 final Allocations newSpace = new Allocations();
1122 final Allocations oldSpace = new Allocations(); 1270 final Allocations oldSpace = new Allocations();
1123 1271
1124 bool get hasNoAllocations => newSpace.empty && oldSpace.empty; 1272 bool get hasNoAllocations => newSpace.empty && oldSpace.empty;
1125 1273
1126 @reflectable final children = new ObservableList<Class>(); 1274 @reflectable final children = new ObservableList<Class>();
1127 @reflectable final subClasses = new ObservableList<Class>(); 1275 @reflectable final subClasses = new ObservableList<Class>();
1128 @reflectable final fields = new ObservableList<ServiceMap>(); 1276 @reflectable final fields = new ObservableList<ServiceMap>();
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 void _addToChildren(Class cls) { 1342 void _addToChildren(Class cls) {
1195 if (children.contains(cls)) { 1343 if (children.contains(cls)) {
1196 return; 1344 return;
1197 } 1345 }
1198 children.add(cls); 1346 children.add(cls);
1199 } 1347 }
1200 1348
1201 Future<ServiceObject> get(String command) { 1349 Future<ServiceObject> get(String command) {
1202 return isolate.get(id + "/$command"); 1350 return isolate.get(id + "/$command");
1203 } 1351 }
1352
1353 void _computeEndTokenPos() {
1354 script.load().whenComplete(() {
1355 int line = script.tokenToLine(tokenPos); // Lines are 1-based.
1356 ClassParser clsp = new ClassParser(script.lines.sublist(line - 1));
1357 List posTuple = clsp.findEndPos();
1358 // Search for the token one this line and column.
1359 List tokenCandidates = [];
1360 script._tokenToLine.forEach((k,v) {
1361 if (script._tokenToLine[k] == posTuple[0]) {
1362 tokenCandidates.add(k);
1363 }
1364 });
1365 Iterable tokenIndex =
1366 tokenCandidates.where((e) => script._tokenToCol[e] == posTuple[1]);
1367 assert(tokenIndex.length == 1);
1368 _endTokenPos = tokenIndex.first;
1369 notifyPropertyChange(#endTokenPos, null, _endTokenPos);
1370 });
1371 }
1204 } 1372 }
1205 1373
1206 class ScriptLine extends Observable { 1374 class ScriptLine extends Observable {
1207 final int line; 1375 final int line;
1208 final String text; 1376 final String text;
1209 @observable int hits; 1377 @observable int hits;
1210 ScriptLine(this.line, this.text); 1378 ScriptLine(this.line, this.text);
1211 } 1379 }
1212 1380
1213 class Script extends ServiceObject with Coverage { 1381 class Script extends ServiceObject with Coverage {
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
1902 var v = list[i]; 2070 var v = list[i];
1903 if ((v is ObservableMap) && _isServiceMap(v)) { 2071 if ((v is ObservableMap) && _isServiceMap(v)) {
1904 list[i] = owner.getFromMap(v); 2072 list[i] = owner.getFromMap(v);
1905 } else if (v is ObservableList) { 2073 } else if (v is ObservableList) {
1906 _upgradeObservableList(v, owner); 2074 _upgradeObservableList(v, owner);
1907 } else if (v is ObservableMap) { 2075 } else if (v is ObservableMap) {
1908 _upgradeObservableMap(v, owner); 2076 _upgradeObservableMap(v, owner);
1909 } 2077 }
1910 } 2078 }
1911 } 2079 }
OLDNEW
« no previous file with comments | « runtime/bin/vmservice/client/lib/src/elements/class_view.html ('k') | runtime/bin/vmservice/client/pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698